目录swift
在swift 3.0 以前,swift 提供3种不一样的访问级别:
1.public(公开)
2.internal(内部)
3.private(私用)
默认的访问级别是internal,这意味着此成员只能在模组(module)内可见。若是要让其可以被模组外的成员访问,那么就要将其设置成public。此外就是private,这意味着私有成员可以在文件内部可见。函数
在swift 3.0当中,咱们将迎来另一种访问级别,private 将会被从新命名为 fileprivate :即文件的私有成员只可以在文件内部可见;咱们将获得第四种访问级别就是 private ,这也就说即便在同一个文件当中,私有成员也只可以在对应的做用域当中可见。所以,swift 3.0中,最终的访问级别就是:
1.public(公开)
2.internal(内部)
3.fileprivate(文件内私有)
4.private(私有)code
自增运算符 ++ 与自减运算符 -- 将被移除,取而代之的即是 count+=1 与 count-=1
例如:ci
while count < 10{ count += 1 } while num < 10{ num -= 1 }
参数是一种不可修改的拷贝,若是你想修改你的传入参数,并禁止拷贝的,那么您能够将其声明为 inout .
在swift 2.2中:作用域
func myfunction(inout input:Int){ }
而在swift 3.0中,将调整为类型修饰,如;input
func myfunction(input : inout Int){ }
inout的另外一个改变,是其的捕获机制受到限制。编译器
func escape(f:()->()){} func example(x :inout Int){ escape{ _ = x } }
一个名为 escape()的函数,它接受一个方法做为其参数。在 example() 方法当中,咱们引入 inout 类型的 x 的参数,并将其传递到 escape方法内。it
当 escape() 函数对 inout x 进行操做时,会形成一个问题,因为 inout 的开销很大。inout 会对传入的变量进行修改 ,而这个时候,并不肯定 example()函数是否可以调用其做用域以外的函数。io
为了解决这个问题,咱们可使用 @noecape 来标记:编译
func escape( f:@noecape()->()){ } //swift 3.0以前的写法: func escape(@noescape f:()->()){ } func exmaple(x:inout Int){ escape{ _ = x} }
这也就意味着,我将告诉编译器,我传递的这个函数 不会使用任何做用域范围以外的东西,所以程序可以正常运行。
func escape(f: @noescape ()->()){ } func noEscape(f :@autoclosure ()->()){ }
protocol Prot{ associatedtype Container : SequenceType }
这表示您须要明确告知Container 随后会关注哪一种类型
extension prot{ typealias Element = Container.Generator.Element }
这种用法与 #define 相似