一: required 必须
二: 属性观察器
三: 可失败初始化器
四: 反初始化器deinit
五: 可选链
六: 协议
七: 类型 Any AnyObject
八: 类型转换 as
九: 原类型 XX.self
十: Self 当前类型
一: require 必须
作用: required修饰符, 只能用于修饰类初始化方法。
1 父类声明required修饰符, 子类必须实现的方法
2 当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override。
3 当子类没有初始化方法时,可以不用实现父类的required初始化方法
截屏2022-05-04 上午11.31.41.png
二: 属性观察器
1 父类指定初始化器, 设置默认存储属性值不触发属性观察器,
2 子类指定初始化器, 赋值父类存储属性会触发属性观察器
截屏2022-05-04 上午11.32.56.png
三: 可失败初始化器
截屏2022-05-04 上午11.33.11.png
// 注意:枚举有初始值时候, 默认生成一个RowValue的初始化器, 这个初始化器就是个可失败初始化器
// 注意 init(name: String)本身没有返回值的, 但是可失败初始化器, 需要return nil
// 注意: init? init!声明可失败初始化器, 都返回可选Person?
"可失败初始化器可以调用非可失败初始化器, 非可失败初始化器调用可失败初始化器需要进行解包"
截屏2022-05-04 上午11.46.43.png
四: 反初始化器
类似oc的dealloc
截屏2022-05-04 下午12.07.47.png
class Animal {
var age: Int = 0
func eat() {
print("animal---eat")
}
init(age: Int) {
self.age = age
}
deinit {
print("animal is die")
}
}
class Dog: Animal {
deinit {
print("dog is die")
}
}
Dog(age: 5)
// dog is die
// animal is die
五: 可选链
// 这个就是可选链.中间包含可选项
注意: 一但发现可选项是nil后面就不会执行了, 直接返回nil
截屏2022-05-04 下午12.30.00.png
截屏2022-05-04 下午12.10.54.png
// 1 Person? 意思为声明可选类型, 可能为空
// 2 var age = person?.age()
// 2.1 如果person为nil, 则age为nil
// 2.2 如果person部位nil, 则age有值
// 2.3 可选链上 age也为可选类型, 尽管age声明的是 Int类型
"如果结构本来就是可选项, 不会进行二次包装"
func age() -> Int {18}
var age = person?.age() // 返回可选项
func age() -> Int? {18}
var age = person?.age() // 还是返回可选项
两者返回结果一致
可选链在字典中的应用
截屏2022-05-04 下午12.38.43.png
六: 协议
作用: 声明~ 仅仅证明~
类, 结构体, 枚举, 遵守协议后需要实现的属性, 方法, 初始化器等
截屏2022-05-04 下午12.41.46.png
协议中的属性
截屏2022-05-04 下午12.43.35.png
// 1 协议声明属性x 为可以读写, 意味着class遵守协议可以用存储属性实现, 也可以用计算属性实现
// 2 协议属性必须用var
// 3 不小于协议定义的属性, 就是定义的是可读, 实现定义个读写是ok的
协议中类型属性定义
截屏2022-05-04 下午1.00.00.png
协议中的mutating使用
截屏2022-05-04 下午1.03.04.png
协议中的初始化器
// 注意: 协议中声明初始化器, 类遵守协议需要加上require, 再去实现
Ps: 保证类的延续, 父类也能初始化
截屏2022-05-04 下午1.08.05.png
协议中的 init init? init! 可失败初始化器
截屏2022-05-04 下午1.23.57.png
协议的继承
// 可以继承协议中的方法, 属性等
截屏2022-05-04 下午1.29.10.png
协议组合 厉害了~~~
1 Man & Protocol1 & Protocol2 这就叫实例组合
2 Person: Man & Protocol1 & Protocol2
// 代表 继承自Man类, 遵守两个协议
3 var jack: Protocol
// 代表遵守协议的一个实例
截屏2022-05-04 下午1.29.21.png
枚举的遍历协议 CaseIterable协议
iterable 英译: 可迭代的
截屏2022-05-04 下午1.36.41.png
打印协议
截屏2022-05-04 下午2.01.06.png
七:类型 Any AnyObject
截屏2022-05-04 下午2.15.52.png
1 AnyObject: 代表类的实例对象
2 Any代表任意对象
3 定义协议只能被类遵守
var array :Array = ["123", 9, {19}, FTLearnSwift()]
var array1: Array = ["123", 9, {19}, FTLearnSwift()]
// Type of expression is ambiguous without more context 表达式类型不明确,没有更多上下文
// 定义个协议 (仅仅能被类遵守)
protocol XXProtocol: AnyObject {
var num: Int{get set}
}
// 创建结构体
struct testStruct: XXProtocol {
var num = 10
}
//Non-class type 'testStruct' cannot conform to class protocol 'XXProtocol' 非类类型“ testStruct”不能符合类协议
“XXProtocol”
@objcMembers class FTLearnSwift: FTBaseViewController, XXProtocol {
var num = 10
override func viewDidLoad() {
super.viewDidLoad()
}
}
八: 类型转换
is: 判断是否为某种类型
as? 转换成功, 可选类型, 失败为nil
as! 转换成功, 会解包为非可选, 失败崩溃
as 转换类型, 明确的类型转换
截屏2022-05-04 下午2.35.40.png
九: 类型
类型 声明类型: MyPerson.Type, 获取类型MyPerson.self
class MyPerson { }
class MyStudent: MyPerson { }
let p: MyPerson.Type = MyPerson.self // 声明类型和赋值类型
let s = MyStudent.self
print(p == MyPerson.self) // true
print(s == MyStudent.self) // true
// MyPerson.Type 定义了类型, 看着很鸡肋~~~
2 Anyclass (代表类类型) 标准库定义的 public typealias AnyClass = AnyObject.Type
var c: AnyObject.Type = MyPerson.self
c = MyStudent.self
print(c) // MyStudent
var c1: AnyClass = MyPerson.self
c1 = MyStudent.self
print(c1) // MyStudent
3 两种获取类型方法 1对象方法:type(of: 对象) 2类方法: 类名.self
let p2 = MyPerson()
print(type(of: p2) == MyPerson.self)
1 X.self类似oc的Class类型 原类型
2 X.self属于X.Type类型 AnyClass类型
3 打印对象per类型type(of: per) 等同于 Person.self == type(of: per) // true
4 AnyClass属于AnyObject.Type的别名:typealias AnyClass = AnyObject .Type
表示任意类的元类型,任意类的类型都隐式遵守这个协议,一般我们使用不多
原类型 XX.self AnyClass类型应用
// 通过类名初始化对象
let k: SwiftTestController = creatObject(objectClass: SwiftTestController.self) as! SwiftTestController
k.dataSource = []
// 通过类名初始化对象
func creatObject(objectClass: SwiftTestController.Type) -> AnyObject {
return objectClass.init()
}
十: Self
Self 代表类型 当前类型
截屏2022-05-04 下午3.42.01.png
总结:
self: Person.self代表原类型, self.age获取对象属性
Self: 代表当前类 Self.count 代表类属性