不知道大家有沒有發(fā)現(xiàn),在一個 Objective-C 和 Swift 混編的 App 中,當(dāng)把一個 OC 中的參數(shù)轉(zhuǎn)到 Swift 時,Swift 會自動把這個變量進(jìn)行強(qiáng)制解包。舉個例子,我在 OC 中定義這樣一個變量:
@property (nonatomic, copy) NSString *foo;
它轉(zhuǎn)成 Swift 就變成了這樣:
var foo: String!
這樣看上去合情合理。Swift 中有 String? 和 String! 兩種形式,但 OC 中沒有 NSString? 和 NSString! ,當(dāng) Swift 無法區(qū)分 OC 中的變量是不是 nil 的時候,一律強(qiáng)行轉(zhuǎn)化為非空參數(shù)。這樣設(shè)計體現(xiàn)了 Swift 強(qiáng)安全性語言的特性。
但是這時候問題來了。我們回到上文中的例子,假如 OC 中對 foo
的使用如下:
@property (nonatomic, copy) NSString *foo;
- (void)secretFunc {
// 一些詭異復(fù)雜的操作
...
self.foo = nil;
}
然后我們在 Swift 中這樣調(diào)用:
func init() { objectiveCObject.secretFunc()
}func calcLen() -> Int {