actor
- 可以理解为类似于线程安全的class
- actor不支持继承
@propertyWrapper
1.属性包装器对set、get方法封装
2.可以将一个结构体添加此关键字,在赋值时可以进行一些操作,使其满足条件
3.使用它有两个要求(1)必须使用属性@propertyWrapper进行定义;(2)必须含有wrappedValue属性
使用 $参数 可以获取到属性包装器呈现的内容
indirect
1.用于修饰枚举,标识此成员可递归
2.enum大小需要case大小,case大小又需要enum大小来计算,所以使用indirect会直接到堆中分配内存
@inlinable
1.当调用时,编译器会将具体实现代码替换
@warn_unqualified_access
1.对二义性问题进行警告
lazy
1.延时加载存储属性是指当第一次被调用的时候才会计算其初始值的属性
willSet、didSet
1.属性观察器
2.不能与set、get方法共同使用
inout
- 输入输出参数,将参数设置为inout,则需要传递地址进去,即可修改交换两个数的值
mutating
- 可变行为,允许修改内部属性
@discardableResult
- 确保带返回值的方法不指定一个接收方可以不会发生警告
final
- 防止方法以及属性或下标防止被重写
convenience
1.便利构造器
2.指定构造器必须调用其直接父类的的指定构造器
3.便利构造器必须调用同类中定义的其它构造器
4.便利构造器最后必须调用指定构造器
override
1.重写父类方法需要使用此关键字
init? init!
1.可失败构造器
2.可判断nil确定是否构造成功
3.子类可以重写父类可失败构造器为不可失败构造器
4.!构建一个隐式解包可选类型的对象
required
1.必要构造器,表明子类都必须实现该构造器
try try? try!
1.try通常与do-catch一起使用,可通过catch捕获异常
2.try? 使用时 不需要使用catch接收异常,也不会发生运行时错误,它会将结果转换为可选值
3.try! 当自己绝对肯定此函数不会发生错误时使用,如果try!抛出异常则会产生运行时错误
defer
1.可以在即将离开当前代码块是执行包含语句
多线程
async(swift 5.5 later)
1.加载函数返回值前面,可以定义一个异步函数
2.一般配合await一起使用,当遇到await函数会暂时挂起,允许其任务在后台运行,一旦异步操作完成,函数将继续执行
3.Task 创建一个异步块,通常用于执行一些异步操作
4.函数如果存在throws则async写到throws前面
5.Task.detached用于启动一个新任务的方法,创立一个独立的任务,不会阻碍当前任务以及线程,(Task.detached可以写一个死循环而不会卡死UI)
6.为了在调用异步函数的时候让它附近的代码并发执行,定义一个常量时,在 let 前添加 async 关键字,然后在每次使用这个常量时添加 await 标记
7.取消Task,将自下而上依次取消
8.Task可以通过.value获取到Task内的return(返回值)
9.可以将让 let xxx = Task, await xxx 来等待返回值或等待任务,当遇到没有返回值的可以通过let xxx:Void获取到Task并等待
func performAsyncTask(_ asyname: String) async -> String? {
let result = Task.detached {
print("Start of the async task")
// 模拟一些耗时操作
try? await Task.sleep(nanoseconds: UInt64(1_000_000_000 * 3))
print(Thread.current)
print("End of the async task")
return asyname
}
return await result.value // 等待任务完成并获取其值
}
async let void:Void = try! Task.sleep(nanoseconds: UInt64(4*1_000_000_000))