final
被final修饰的方法、下标、属性,禁止被重写/被final修饰的类,禁止被继承
mutating
值类型(结构体、枚举)的方法要修改成员的话,需要加上mutating。协议方法声明为mutating,实现也要mutating
required
用required修饰指定初始化器,表明其所有子类都必须实现该初始化器(通过继承或者重写实现)
如果子类重写了required初始化器,也必须加上required,不用加override
typealias
别名 typealias RealPerson = Person & Livable & Runnable ,func fn(obj: RealPerson) {}
Any
可以代表任意类型(枚举、结构体、类,也包括函数类型)
AnyObject
可以代表任意类类型(在协议后面写上: AnyObject代表只有类能遵守这个协议)
AnyClass
public typealias AnyClass = AnyObject.Type
is
用来判断是否为某种类型,以及是否是相同的类、其子类、是否遵守判断的协议
as?、as!、as
as用来做强制类型转换 (stu as? Student)?.study()
Self
Self一般用作返回值类型,限定返回值跟方法调用者必须是同一类型(也可以作为参数类型)。类似OC中的instancetype
throws
1 函数内部通过throws抛出自定义Error,可能会抛出Error的函数必须加上throws声明
2 不捕捉Error,在当前函数增加throws声明,Error将自动抛给上层函数
rethrows
rethrows表明:函数本身不会抛出错误,但调用闭包参数抛出错误,那么它会将错误向上抛
defer
用来定义以任何方式(抛错误、return等)离开代码块前必须要执行的代码
defer语句将延迟至当前作用域结束之前执行
defer{}一般拿来做确保完成的,收尾的工作。
associatedtype
关联类型的作用:给协议中用到的类型定义一个占位名称。协议中可以拥有多个关联类型
associatedtype Element // 关联类型
some
使用some关键字声明一个不透明类型。用于隐藏返回类型,或一次那个属性类型
some限制只能返回一种类型
some除了用在返回值类型上,一般还可以用在属性类型上
some也用于枚举中关联值
var age3:Optional<Int> = Optional.some(30)
inout
修改了函数的参数,需要添加输入输出参数,变为引用传递。inout关键字
open、public、internal、fileprivate、private
以模块、文件为单位控制访问权限。绝大部分实体默认都是 internal 级别
1 open:允许在定义实体的模块、其他模块中访问,允许其他模块进行继承、重写(open只能用在类、类成员上)
2 public:允许在定义实体的模块、其他模块中访问,不允许其他模块进行继承、重写
3 internal(内部):只允许在定义实体的模块中访问,不允许在其他模块中访问
4 fileprivate:只允许在定义实体的源文件中访问
5 private:只允许在定义实体的封闭声明中访问
weak、unowned
weak定义弱引用.通过unowned定义无主引用
import Dispatch
导入GCD模块,
UnsafePointer、UnsafeMutablePointer、UnsafeRawPointer、UnsafeMutableRawPointer
UnsafePointer<Pointee> 类似于 const Pointee *
UnsafeMutablePointer<Pointee> 类似于 Pointee *
UnsafeRawPointer 类似于 const void *
UnsafeMutableRawPointer 类似于 void *
指针pointee访问无泛型,有泛型指针获取load是加载,store是存储。
ptr.pointee += 20
ptr.storeBytes(of: 20, as: Int.self)
ptr.load(as: Int.self)
@frozen、@inlinable
@frozen 和 @inlinable 是保证这个enum, struct, function的结构不变
@frozen 是对 enum, struct 使用
@inlinable 是对 function 使用
可以保证在项目中引用的某 framework 替换后仍然不需要重新编译,
因为 enum, struct, function 的链接没有发生改变
@_silgen_name
如果知道系统级别的函数,但是该函数没有头文件暴露,可以用这个方法调用。
比如用下面的方法:
第一步我们在上面WS_Person.h中去掉int sum(int a, int b);函数声明
第二步,然后在Swift文件中全局区
@silgen_name("sum")
func sum( v1: Int32, _ v2: Int32) -> Int32
第三步,直接调用sum(33, 44)
@objcMembers
必须是被@objcMembers或@objc修饰的方法才可以定义选择器。我们给button,手势,添加方法。也要用到@objc.
OC调用swift,@objcMembers修饰swift类。代表默认所有成员都会暴露给OC(包括扩展中定义的成员)
@objc
1 OC调用swift,使用@objc修饰swift文件的属性或方法,选择性暴露给OC。
2 OC调用swift,可以通过 @objc 重命名Swift暴露给OC的符号名(类名、属性名、函数名等)
3 被 @objc 修饰的协议,还可以暴露给OC去遵守实现
4 可以通过 @objc 定义可选协议(这种协议只能被 class 遵守)
5 必须是被@objcMembers或@objc修饰的方法才可以定义选择器。
我们给button,手势,添加方法。也要用到@objc.原理同1,没有暴漏给OC的方法名是不能使用的。
perform(@Selector)和 @selector()本来就是Runtime,OC的。
dynamic
被 @objc dynamic 修饰的内容会具有动态性,比如调用方法会走runtime那一套流程
Swift 支持 KVC \ KVO 的条件:属性所在的类、监听器最终继承自 NSObject,并且@objc dynamic 修饰对应的属性。
@discardableResult
@discardableResult 表示返回值可以忽略,如果没有用到返回值也不会有警告
Sequence
Sequence 是一个协议,它表示一个可以遍历其元素的集合类型。任何遵循 Sequence 协议的类型都必须提供一个迭代器,用于按顺序访问其元素。Swift 标准库中的许多集合类型,如数组(Array)、集合(Set)、字典的值(Dictionary.Values)以及字符串(String),都遵循 Sequence 协议。此外,你也可以创建自定义类型并使其遵循 Sequence 协议,以提供自定义的遍历行为。
Sendable 和 @Sendable
Swift 5.5 的版本,Apple 引入了多项对于并发性改进,其中 Sendable 和 @Sendable 是两个核心概念,它们解决了结构化的并发结构体和 actor 消息之间传递的类型检查问题。类不是线程安全的,不能传递,所以编译器不能隐式地将其标记为 Sendable。因为 final class 是不可改变的(immutable),因此它是线程安全的,所以我们可以显示的让其遵守 Sendable 协议。
Sendable 协议是 Swift 并发模型中的一个关键协议,它向编译器表明某个类型是否可以被安全的跨并发域(如 actors、并发队列等)传递。当类型符合 Sendable 协议时,编译器可以保证该类型的实例在并发环境下是线程安全的。
Sendable
@inlinable
编译器内联函数优化
inlinable中文
inlinable英文
try-catch
do {
try expression
} catch {
print(error)
}