前言
用了这么久Swift, 在自己对项目做重构的时候, 发现自己对很多基础理解还是不深刻,还需要时不时的进行查阅,特此努力学习了一波,以此记录,多有理解不当,望见谅
1. 权限修饰关键字
private :
private修饰的属性或方法只能在当前类中使用; 当调用不在当前类中,即使是当前类相关对象也不能使用private修饰的Class或Struct在除在自身内部使用;其它的都不被允许(包括类的继承和实例化),因此一般开发中不会用private修饰Class和Structprivate修饰的protocol,只允许在当前文件中遵循该protocol;其它的都是不被允许的(包括类型申明, 函数或方法中的形参申明)
filePrivate:
filePrivate修饰的属性或方法,只能在当前文件中使用;当前文件内, 可以跨类调用fileprivate修饰Class或Struct,Class在当前文件内可以实例化和继承使用,在当前文件之外的任何地方都不允许被使用fileprivate修饰的protocol,同private修饰protocol效果一致, 都是只允许在当前文件中遵循, 不允许类型申明使用, 函数和方法的形参声明
internal:
Swift 默认权限修饰关键字, 一般不用声明, 只允许在当前module中使用,继承, 重写
public:
public修饰的属性,Struct和protocol,允许跨module使用public修饰的Class,允许跨module使用,但是public修饰的Class是不允许跨module继承public修饰的方法, 允许跨module使用; 但是不允许跨module重写,即使是该方法的类是采用open修饰
open:
open修饰的属性,跟public一致, 因为存储型属性不予许重写open不允许修饰protocol,Struct,Struct方法, 是因为open修饰的,表示可重载open修饰方法, 允许跨module调用和重写open修饰class,允许跨module使用和继承
小结
权限从小到大的排序为 private < fileprivate < internal < public < open
2.1编译型关键字
static:
- 不允许修饰
class,struct,protocol, 函数 static,修饰的方法,是不可重写的, 因此不允许同时使用open修饰static,修饰的方法采用直接派发
dynamic:
- 动态的,同样不允许修饰
class,struct,protocol - 采用
dynamic修饰的函数和方法,会采用运行时消息机制派发
@objc :
- 允许
Objective-C的调用,@objc修饰的类,属性, 方法,是给当前的修饰属性或方法注入到Objective-C的运行时中,允许Objective-C的运行时派发 @objc不允许修饰struct,函数- 继承至
NSObject的类, 属性和方法默认是采用@objc修饰的,无需再添加@objc修饰
@nonobjc:
- 修饰的类, 属性, 方法,不允许注入到
Objective-C运行时中, 禁止这个被修饰的属性,方法采用消息派发的机制, 即不被允许Objective-C中调用 @nonobjc不允许修饰类,结构体,协议,函数
@inline(options):
- 编译器将根据项目的优化设置,进行相关的内联决策, 当然这个对二进制文件大小也有相关的影响,编译的速度也有影响
option: __always,表示如果有可能, 希望编译器能够内联当前修饰的方法,当然是可能的话, 就会有不生成内联的情况, 比如在强制动态派发的情况下就无法进行内联option: never,表示不被内联- 只能修饰函数或方法
@inlinable:
- 将函数或方法申明为内联函数,编译器会在编译时将该段函数调用用具体实现代替,这么做可以省去函数调用的时间, 从而达到性能优化的目的; 换取的代价是,将会稍微增加二进制文件的大小
- 可以跨模块实现内联
- 只能修饰函数或方法
final:
- 不允许修饰结构体,
procotol,函数 - 采用直接派发
- 被修饰的类或者方法,是不能被继承和重写的
mutating:
用于修饰结构体的实例方法中,进行修改结构体属性值时
@escaping:
用于修饰闭包,防止闭包在方法或者函数返回时销毁,叫做允许闭包逃逸
小结
合理的关键字的使用,可以有效的提高应用性能;但是切记在不明白用处的时候,最好不用,比如@inline(__always),因为这个修饰的内联是不定的,因此最好是不要去使用它,除非你知道你要干什么(我现有的知识储备提醒我这么做的)
2.2函数修饰关键字对应的编译的结果
各个编译性关键字对应的编译结果, 存在修饰关系的遗漏的情况
3.总结
Swift的关键字太多,后续继续整理, 如有理解不当的情况,欢迎指正,我也会积极查证,谢谢~
关于上诉提到的派发机制,这里简单解释一下: 是swift 方法调用的一种机制,具体的介绍参考《深入理解swift 派发机制》同时这里也解释一下文中提到的关于 @nonobjc 和 final 的区别 @nonobjc 修饰的方法如果没有用final 或者static 修饰的话,则表示, 既可能采用函数表派发,也可能采用直接派发,这个取决于具体的方法实现; 而 final 修饰的方法,则只采用直接派发