1. @objc
- Swift 是静态语言, 编译的时候就知道谁调用谁了
- OC 是运行时语言, 是通过消息的运行循环来一层层找的
- 在 Swift4.0 之后 (包括4.0), 继承于 NSObject 的所有 Swift Class 不会在默认 bridge 到OC, 也就是没有告诉系统 Swift Class内容的存在, 所以就会找不到
- @objc的应用:
4.1 @objc应用于函数是为了能够让函数表达为 #selector
4.2 @objc应用于变量是为了能够让变量表达为keypath字符串,进而使用kvc功能
4.3 @objc dynamic应用于变量是为了让变量能够使用kvo机制。
翻译过来也就是说,
- 定义类似于按钮点击等需要通过发送消息来确定事件的方法是, 需要在方法前添加@objc 关键字
- 使用KVC字典转模型时, 在当前类的每个属性前面 添加 @objc 关键字(或者在当前类的最上方 添加 @objcMembers 关键字)
2. private 和 fileprivate
- private 访问级别是最低和最严格的级别, 也就是说限制性最强
- private 所修饰的属性或者方法 只能在 当前类 里面进行访问, 对于不希望对外暴露的方法, 应该使用 private 关键字来修饰
- Swift3.0 如果 private 修饰的方法写在其类的 extension 中时, extension外则无法无访问, 若要访问需要修改成 fileprivate
- Swift4.0 之后 被 private 修饰的属性和方法, 只可以在该类下使用 (包括 extension 中, 因为是同类), 反之也可以
- 即使在同一文件夹下, 使用 private 修饰 不同类的属性和方法是不能调用的, 就算 继承 的话, 父子在同一文件下, 子类也无法调用
- fileprivate 修饰的话, 在同一定义的源文件(就是同一个.swift文件)中是可以相互调用的
private 和 fileprivate 异同: private 不能在 class 以外访问, 且必须是同类中,而 fileprivate 作用域是当前文件, 可以是不同类
.End
网友评论