求职ing, 广州初级 iOS 开发求收留
前两天 swift 3.0 更新了 beta 6, 权限访问的几个关键字有了一些改变, 这篇文章给大家简单介绍一下(真得很简单…)
还有一些小改变, 其中几个让人觉得很诡异:
typealias completion = (data: Data, error: Error?) -> Void
就会报错, 必须加上 _
或者删掉参数标签 @nonescaping
的, 如果闭包不是在当前作用域内执行而是还要继续传递到别的函数里的话, 那就必须加上 @escaping
AnyObject?
改成了 Any
, 很多原本要通过键值对取值的写法都得强转成字典或者是 Anyobject? open
关键字, public
变得没那么 public
beta 6 新增加了 open
关键字, 可以理解为之前的 public
在同一个包 module 内, public 跟 open 的含义是一样的, 但是在 module 外, open 声明的成员变量和函数是可以被 override 的, 而 public 只是把接口公开出去, 而不能被 override
open
大概有这么几个规则:
open
. open
和 final
open
的类的父类必须也是 open
的, 父类的父类也必须会被按照这条规则递归约束 这个主要是区分开 Module 外可访问 和 Module 外可被修改 这两个概念, 具体可以看 [SE-0117]Allow distinguishing between public access and public overridability 提案
//--------Module Foo------- class Foo{ public var one: Int { return 1 } open var two: Int { return 2 } } class A: Foo{ // 正常运行 override var one: Int { return 2 } // 正常运行 override var two: Int { return 1 } } //------End of Module------ //--------Module Bar------- class B: Foo{ // 报错 override var one: Int { return 2 } // 正常运行 override var two: Int { return 1 } } //------End of Module------
另外还有一点, 就是 Objective-C 的库导入的话默认都为 open
, 之前是 public
fileprivate
, 而 private
变得更加 private
不写任何修饰符的话, beta 6之前默认是 public
, 为了安全, 我们很多时候都必须在变量和实现的函数前面加上 private
, 而 beta 6现在的 默认访问权限
就类似于之前的 private
, 默认为 fileprivate
, 文件内可被访问, 文件外不可访问
//---- 文件 Foo.swift ---- class Stack{ fileprivate var one = 1 func two() {...} } class Over{ // 正常运行 func a() { var foo = Foo() print(foo.one) foo.two() } } //--------- EOF --------- //----- 文件 A.swift ----- class Flow{ // 都报错, 提示 one 跟 two 都不可被访问 func a() { var stack = Stack() print(stack.one) stack.two() } } //--------- EOF ---------
而 private
就变得更加 Private, 只有作用域内可以访问
class Foo{ private var one = 1 var two = 2 } extension Foo{ func bar() { one = 2 // 报错 two = 3 // 正常运行 } }