Swift 关键字从外到里

前言

用了这么久Swift, 在自己对项目做重构的时候, 发现自己对很多基础理解还是不深刻,还需要时不时的进行查阅,特此努力学习了一波,以此记录,多有理解不当,望见谅

1. 权限修饰关键字

private :

1. private 修饰的属性或方法只能在当前类中使用; 当调用不在当前类中,即使是当前类相关对象也不能使用
2. private 修饰的Class或Struct 在除在自身内部使用;其它的都不被允许(包括类的继承和实例化),因此一般开发中不会用private 修饰Class 和Struct
3. private 修饰的protocol,只允许在当前文件中遵循该protocol;其它的都是不被允许的(包括类型申明, 函数或方法中的形参申明)
复制代码

filePrivate:

 1. filePrivate 修饰的属性或方法,只能在当前文件中使用;当前文件内, 可以跨类调用
 2. fileprivate  修饰Class 或 Struct,Class 在当前文件内可以实例化和继承使用,在当前文件之外的任何地方都不允许被使用
 3. fileprivate  修饰的protocol, 同private 修饰protocol 效果一致, 都是只允许在当前文件中遵循, 不允许类型申明使用, 函数和方法的形参声明
复制代码

internal:

 1. Swift 默认权限修饰关键字, 一般不用声明, 只允许在当前module 中使用,继承, 重写
复制代码

public:

 1. public 修饰的属性, Struct和protocol,允许跨module 使用
 2. public 修饰的Class,允许跨module 使用,但是public 修饰的Class是不允许跨module 继承
 3. public 修饰的方法, 允许跨module 使用; 但是不允许跨module 重写,即使是该方法的类是采用open 修饰
复制代码

open:

 1. open 修饰的属性,跟public 一致, 因为存储型属性不予许重写
 2. open 不允许修饰protocol,Struct, Struct方法
 3. open 修饰方法, 允许跨module 调用和重写
 4. open 修饰class,允许跨module 使用和继承
复制代码

小结

权限从小到大的排序为 private < fileprivate < internal < public < open

2.1编译型关键字

static:

 1. 不允许修饰class, struct,protocol, 函数
 2. static,修饰的方法,是不可重写的, 因此不允许同时使用open修饰
 3. static,修饰的方法采用直接派发
复制代码

dynamic:

 1. 动态的,同样不允许修饰class, struct,protocol
 2. 采用dynamic 修饰的函数和方法,会采用运行时消息机制派发	
复制代码

@objc :

 1. 允许Objective-C的调用,@objc修饰的类,属性, 方法,是给当前的修饰属性或方法注入到Objective-C的运行时中,允许Objective-C 的运行时派发
 2. @objc 不允许修饰 struct,函数
 3. 继承至NSObject 的类, 属性和方法默认是采用@objc修饰的, 无需再添加@objc修饰
复制代码

@nonobjc:

 1. 修饰的类, 属性, 方法,不允许注入到Objective-C 运行时中, 禁止这个被修饰的属性,方法采用消息派发的机制, 即不被允许Objective-C中调用
 2. @nonobjc 不允许修饰类,结构体,协议,函数
复制代码

@inline(options):

 1. 编译器将根据项目的优化设置,进行相关的内联决策, 当然这个对二进制文件大小也有相关的影响,编译的速度也有影响
 2. option: __always,表示如果有可能, 希望编译器能够内联当前修饰的方法,当然是可能的话, 就会有不生成内联的情况, 比如在强制动态派发的情况下就无法进行内联
 3. option: never,,表示不被内联
     只能修饰函数或方法
复制代码

@inlinable:

 1. 将函数或方法申明为内联函数,编译器会在编译时将该段函数调用用具体实现代替,这么做可以省去函数调用的时间, 从而达到性能优化的目的; 换取的代价是,将会稍微增加二进制文件的大小
 2. 可以跨模块实现内联
 3. 只能修饰函数或方法
复制代码

final:

 1. 不允许修饰结构体,procotol,函数
 2. 采用直接派发
 3. 被修饰的类或者方法,是不能被继承和重写的
复制代码

mutating:

 1. 用于修饰结构体的实例方法中,进行修改结构体属性值时
复制代码

@escaping:

 1. 用于修饰闭包,防止闭包在方法或者函数返回时销毁,叫做允许闭包逃逸
复制代码

小结

合理的关键字的使用,可以有效的提高应用性能;但是切记在不明白用处的时候,最好不用,比如@inline(__always),因为这个修饰的内联是不定的,因此最好是不要去使用它,除非你知道你要干什么(我现有的知识储备提醒我这么做的)

2.2函数修饰关键字对应的编译的结果

各个编译性关键字对应的编译结果, 存在修饰关系的遗漏的情况

image.png

3.总结

Swift的关键字太多,后续继续整理, 如有理解不当的情况,欢迎指正,我也会积极查证,谢谢~

关于上诉提到的派发机制,这里简单解释一下: 是swift 方法调用的一种机制,具体的介绍参考《深入理解swift 派发机制》同时这里也解释一下文中提到的关于 @nonobjc 和 final 的区别 @nonobjc 修饰的方法如果没有用final 或者static 修饰的话,则表示, 既可能采用函数表派发,也可能采用直接派发,这个取决于具体的方法实现; 而 final 修饰的方法,则只采用直接派发

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享