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 属性
计算型属性本身不占用内存空间
不可以给计算型属性设置数值
相关文章推荐
- Apple Swift学习教程
- 介绍 Fedora 上的 Swift
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- Swift编程中的泛型解析
- Swift中定义二维数组的方法及遍历方法示例
- 简单分析Swift语言的一些基本特征
- Swift与C语言指针结合使用实例
- Swift心得笔记之控制流
- 用Swift构建一个简单的iOS邮件应用的方法
- 苹果公司推出的新编程语言Swift简介和入门教程
- 探讨Swift数组和字典
- Swift中的指针操作和使用详细介绍
- Swift中使用正则表达式的一些方法
- Swift心得笔记之运算符
- Swift中使用可选类型完美解决占位问题
- Swift学习笔记之构造器重载
- Swift中的Access Control权限控制介绍
- Swift类型创建之自定义一个类型详解
- Swift教程之控制流详解