1. 仿照OC 来写set/get方法
import UIKit
class Person: NSObject {
private var _name: String?
// 仿照 OC来写get/set 这种方式几乎不用
// 格式: 属性声明之后 + {set/ge}
var name: String?{
// 仿照OC中, get方法返回带有下划线的成员变量!
// 在Person类中, 没有带有下划线的成员变量, 那我们就自己声明一个.
// 仿照OC中, 在外界无法使用 点语法, 点出带有下划线的成员变量, 这里就需要添加 private关键字来修饰
// private: 私有的, 用来修饰属性或者方法, 告知属性或方法只能在其类内部使用.
get{
return _name
}
// 仿照OC中, set方法就是对带有下划线的成员变量进行赋值
// 这种方法里系统默认就会提供 newValue, 也就是外界给赋的值
set{
_name = newValue
}
}
}
2. 只读属性的写法
import UIKit
class Person: NSObject {
var name: String?
// 只读属性写法 01
var title: String?{
get{
// 这种情况, 当外界为name赋值之后, 打印title就会出现错乱的状态
// 打印结果: Optional("我叫Optional(\"Tom\")")
// 原因: 第一个Optional 是因为title为可选值; 第二个Optional 是因为name为可选值;
// return "我叫" + "\(name)"
// 这种情况, 不管外界对name赋值与否, 都能正常打印了
// 打印结果: Optional("我叫Tom")
return "我叫" + "\(name ?? "")"
}
}
// 注意: 当一个属性为 只读属性时, get{} 可以省略不写, 因此可以得出:
// 只读属性写法 02
var title2: String?{
return "我叫" + "\(name ?? "")"
}
}
3. 存储型属性和计算型属性
/*
- 存储型属性 既能存又能取, 需要开辟内存空间.
- 计算型属性 只能取(只能读), 执行函数时直接返回其他内存地址; 自己不分配独立空间保存计算结果, 每次执行都会被调用.
*/
4.计算型属性和懒加载
import UIKit
// 懒加载(lazy) 和 计算型属性(只读属性) 写法有点相似...
class Person: NSObject {
var name: String?
/* 懒加载
1. 在第一次调用时, 执行闭包, 并且分配空间存储闭包返回的数据值.
2. 会分配独立的存储空间.
3. 与OC 不同的是, 即便初始化结果为nil, 也算初始化成功, 再也不会被调用了.
*/
lazy var title: String = {
return "我叫" + "\(name ?? "")"
}()
/* 计算型属性
1. 只读
2. 不分配独立存储的控件保存计算结果
3. 更像一个函数, 不过不能接受参数,但必须要有返回值
*/
var title1: String?{
return "我叫" + "\(name ?? "")"
}
}
5. as! (类型的强转)
// 以tableView初始化cell为例
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// as! 肯定可以转成我想要的类型 相当于OC中(PersonCell *)
let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier", for: indexPath) as! PersonCell
return cell
}
6. description (通过自定义模型来理解)
import UIKit
/* description
OC 中 是一个方法
Swift中 是一个属性,一个只读属性, 打印模型属性时候使用方便一点
*/
class PersonModel: NSObject {
var name: String?
var age: Int = 0
// kvc构造函数 - 在这里是原生的字典转模型
init(dict:[String: Any]) {
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {
}
// swift中写法
override var description: String{
// keys
let keys = ["name", "age"]
return dictionaryWithValues(forKeys: keys).description
}
// 外界打印模型的时候, 结果: ["name": Tom, "age": 18]
}
7. didSet
- 在OC 中, 一般赋值都会重写set方法接收数据.
- 在Swift中, didSet方法就是最常用的赋值方法, 在之后笔记中, 将会以一个demo的形式详细说明.