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的信息。 |