// 类和结构体
// 在Swift中对结构体进行了很多的加强,和类有很多共同点 1 都可以定义属性 也可以定义方法 2 定义构造器和OC中构造方法(init)类似 3 都可以扩展 4 都遵循协议
// 不同点 1 结构体是值类型 类是引用类型的 2 结构体不可以被继承 类可以继承 3 类可以进行类型判定 例如OC中的isKindOfClass 4 类可以通过析构器释放其占有的资源(deinit)5 类是引用类型,一个类的实例可以有多个引用
// 定义一个结构体
struct Resolution{
var width = 0.0
var height = 0.0
}
// 定义一个类
class VideoMode{
var resolution = Resolution() // 定义了一个Resolution实例
var frameRate = 0.1 //帧率
}
// 创建一个VideoMode的实例
var videoMode = VideoMode()
// 不给属性赋初值的差别
struct ResolutionA{
var width: Double // 不给初始值
var height: Double
init(width: Double, height: Double){
// 系统默认的初始化方法, 自动创建了外部参数
self.width = width
self.height = height
}
}
// 定义一个类
class VideoModeA{
var resolution = ResolutionA(width: 1280.0, height: 720.0) // 没有初始化的值 在创建实例时 要进行初始化
var frameRate = 0.1 //帧率
}
// 创建一个VideoMode的实例
var videoModeA = VideoModeA()
println("result:\(videoModeA.resolution.width)")
videoModeA.resolution.width = 2888.0 // 给结构体赋值
println("result:\(videoModeA.resolution.width)")
// Swift中属性分为两种 存储属性 (直接赋值 类似变量) 计算属性 (setter getter方法)
// 存储属性是在特定的类或者结构体实例的常量或者变量 可以是变量存储属性var 常量的存储属性let
// 计算属性提供setter getter 方法 一般不直接存储值, 而是通过get取值 set是可选的来间接设置其他属性或者变量的值
struct Point{
var x = 0.0
var y = 0.0
}
struct Size{
var width = 0.0
var height = 0.0
}
struct Rect{
var origin = Point()
var size = Size()
var center: Point{
get{
// 取值
let centerX = origin.x + size.width/2
let centerY = origin.y + size.height/2
return Point(x: centerX, y: centerY)
}
set(newCenter){
origin.x = newCenter.x - size.width/2
origin.y = newCenter.y - size.height/2
}
}
// 在枚举或者结构体中直接修改属性的值需要使用mutating
mutating func changeCenter(center: Point){
self.center = center
}
}
var origin = Point(x: 0.0, y: 0.0)
var size = Size(width: 100, height:100)
var frame = Rect()
frame.origin = origin
frame.size = size
println("result:\(frame.center.x)")
frame.center = Point(x: 100,y: 100) // set改变值
println("result:\(frame.center.x)")
// 定义一个类 使用class
class Person{
var identify = ""
var name: String? //(可选变量)取值需要解包
var sex: String // 属性可以不在定义的时候初始化,需要在构造函数里面初始化
let someOne: String
init(name: String,sex: String){
self.name = name
self.sex = sex
someOne = "1"
}
// 定义一个实例方法
func description() -> String{
return "姓名 " + self.name! + " 性别 " + self.sex
}
// 析构器,在对象销毁的时候进行操作
deinit{
}
// 类型方法
class func description() -> String{
return"这是个人"
}
// 类型属性, 在类中类型属性只能是计算属性 如果不写set方法 是只读的
class var star: String{
get{
return "地球"
}
}
}
var personA = Person(name: "李四",sex: "男")
var personB = Person(name: "大黄",sex: "男")
println("\(personA.description())") // 实例方法
println("\(Person.description())") // 类型方法
println("\(Person.star)") // 类型属性
// 继承
class Student: Person{
init(name: String,sex: String){
super.init(name: name,sex: sex) // 直接调用父类放入初始化方法
self.identify = "Student"
}
// 重写父类方法 override
override func description() -> String{
return "我是一个学生" + super.description()
}
}
var student: Person = Student(name: "王五",sex: "男")
println("\(student.description())")
// 在Swift中类型判定使用is
if student is Student{
println("这是一个学生")
}else{
println("这不是一个学生")
}
// 协议
protocol aProtocol{
class func typeFunc() // 类型方法
mutating func changeValue() // 在枚举或者结构体中直接修改属性的值需要使用mutating
}
// 声明一个结构体遵守协议
struct aStruct: aProtocol{
static func typeFunc(){ // 类型方法 static
}
mutating func changeValue(){ // 在枚举或者结构体中直接修改属性的值需要使用mutating
}
}
// 声明一个类遵循协议
class aClass: aProtocol{
class func typeFunc(){ // 类型方法 class
}
func changeValue(){ // 在枚举或者结构体中直接修改属性的值需要使用mutating
}
}
// 创建实例遵循协议
var aProtocolInstance: aProtocol = aClass()
// 声明一个协议,里面有可选的方法 @optional,需要在protocol之前加objc
@objc protocol bProtocol{
func typeFunc()
@optional func changeValue() // 可选的 不用一定实现
// 加了objc 不能使用mutating
}
// 如果某个类既有父类又遵循协议 (父类要在前)
class bClass: Person, bProtocol{
func typeFunc(){
}
}