Swift带来很多确实很棒的特性,使得很难再回到Objective-C。主要的特性是安全性,不过这也被看成是一种额外副作用。 带类型接口的强型别Swift有强型别,这意味着除非你要求,不然Swift不会为你做类型之间的转换。所以,例如你无法把Int型赋给Double型。你不得不首先转换类型: let i: Int = 42 let d: Double = Double(i) 或者你必须给Double类扩展一个方法用来转换Int型: extension Double { func __convert(i: Int) -> Double { return Double(i) } } let another_d: Double = i 强型别对于安全性是非常非常有利的。但是,如果它没有为你给类型接口添加许多类型信息的话,它也可能变成有一点令人生畏的事情,有点像是在写脚本语言。 let ary = ["Hello", "world"] // NOTE: 'ary' is of type String[] or Array<String> for s in ary { // NOTE: 's' is of type String print(s + " ") } 如果你想要创建一个包含很多类型(无共同祖先)的数组,你应该用枚举(它可以包含值,见如下)。如果你想要它能够包含所有值,你可以用Any型。如果想让它包含任何Objective-C的类型,那就用AnyObject型。 请注意类型接口不会在申明函数的时候为你添加类型。你必须明确地说明你所申明函数的类型。 BlocksSwift 中的Blocks很像Objective-C中的Blocks, 不过有两点不同: 类型推断和避免weakify dance. 对于类型推断,你不必每次写block时都包含完整类型信息: sort([2,1,3], { (a: Int, b: Int) -> Bool in return a < b }) // Using Type Inference // Using the Trailing Closures feature sort([2,1,3]) { a, b in return a < b } // Implicit 'return' for single-expression blocks sort([2,1,3]) { a,b in a<b } // Shorthand Argument Names sort([2,1,3]) { $0 < $1 } // Operators are functions, and functions are blocks too! let sorted: Int[] = sort([2,1,3], <) 访问 Closures 了解更多blocks信息。 除此之外,Objectvie-C 的weakify dance有点容易,只需在block的开始处加上 [unowned self] 或 [weak self] 即可。 class CallbackTest { var i = 5 var callback: (Int -> ())? // NOTE: The optional callback takes an Int deinit { // NOTE: This is like -dealloc in Objective-C println("Deinit") } } var obj = CallbackTest() obj.callback = { [unowned obj] // NOTE: Without this, deinit() would never be invoked! a in obj.i = a } 请注意Introduction post文章中介绍了Optional(像上面的callback)。 请参考 ARC 章节来了解更多关于Swift中ARC的信息。 |