您的位置:首页 > 移动开发 > Swift

Swift基础学习笔记(关于类)

2016-03-02 20:06 357 查看

构造函数

在 OC 中的构造函数是 initWithXXX,在 Swift 中由于支持函数重载,所有的构造函数都是 init

新建Person类,定义了必选属性

class Person: NSObject {
//此处定义了必选属性
var name: String
var no: Int
override init() {
//如果一个类中定义了必选属性,必须为这些必选属性分配空间并且设置初始值
name = "simapierce"
no = 12345
//调用父类的构造函数初始化父类的属性
super.init()
}
}

// 创建对象
let p = Person()
//此时打印初始化设置的值
print(p.name,p.no)


总结:

必选属性,必须为他们设置初始值,从而保证对象在被实例化的时候,属性都被正确初始化

在调用父类构造函数之前,必须保证本类的属性都已经完成初始化

Swift 中的构造函数不用写 func

新建Human类,定义可选属性 ,默认为nil
class Human: NSObject {
var name: String?
var height: Float?
}
//使用
let h = Human()
h.name = “jack”//此处不赋值的话,打印出为nil
print(h.name ?? "anonymous”)//此处不解包的话,为optional(jack)


可选属性不需要设置初始值,默认初始值都是 nil

可选属性是在设置数值的时候才分配空间的,是延迟分配空间的,更加符合移动开发中延迟创建的原则

重载和重写

重载,函数名相同,参数名/参数类型/参数个数不同

重载函数并不仅仅局限于构造函数

函数重载是面相对象程序设计语言的重要标志

函数重载能够简化程序员的记忆

OC 不支持函数重载,OC 的替代方式是 withXXX…

重写,子类需要在父类拥有方法的基础上进行扩展,需要 override 关键字

KVC

KVC本质上是在运行时,动态向对象发送setValue: forKey:方法,为对象的属性赋值,因此,在使用KVC方法之前,要确保对象已经被正确实例化

class Human: NSObject {
//可选项的默认值是nil,可选项会默认为我们分配空间
var name: String?

//基本数据类型在Swift ,与KVC不兼容
//如果基本数据类型为nil,KVC在调用 setValue(value: AnyObject?, forKey key: String) 找不到这个属性
//解决办法:给基本数据类型设置初始值
var height: Float = 0

init(dict: [String: NSObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
//在OC中,当模型类中的属性比字典的key少时会崩溃,此时重写forUndefinedKey,即使字典中的key多于模型类属性,也不会崩溃 ,
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
//什么都不用做
}
}
//使用
//       let h = Human(dict: ["name":"jack","height":12,"age":12])
//        print(h.name)

子类可以继承父类的KVC构造方法,不用再重写


便利构造函数

convenience init?(targetHeight: Float){
if targetHeight < 160.0 {
return nil
}
self.init(dict: ["height": targetHeight])
}
使用:
let h = Human(targetHeight: 159)
print(h?.height)


关键字 convenience修饰

可以返回nil

用self调用本类中定义的其他构造函数或者调用父类的便利构造函数

用途:根据给定参数判断是否创建对象,而不像指定构造函数那样必须要实例化一个对象出来

在实际开发中,可以对已有类的构造函数进行扩展,利用便利构造函数,简化对象的创建

,例如创建button时做判断,如果没有为其设置title等,返回空

懒加载

//懒加载 -- 最简单的懒加载
lazy var p: Person = Person()
//其他用法,类似闭包
lazy var label: UILabel = {

let label = UILabel()

label.font = UIFont.systemFontOfSize(16)

label.textAlignment = .Center

return label
}()


存储型属性 & 计算型属性

存储型属性 - 需要开辟空间,以存储数据

计算型属性 - 执行函数返回其他内存地址

只实现 getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性

计算型属性本身不占用内存空间

不可以给计算型属性设置数值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swift