不知道大家有没有发现,在一个 Objective-C 和 Swift 混编的 App 中,当把一个 OC 中的参数转到 Swift 时,Swift 会自动把这个变量进行强制解包。举个例子,我在 OC 中定义这样一个变量:

@property (nonatomic, copy) NSString *foo;

它转成 Swift 就变成了这样:

var foo: String!

这样看上去合情合理。Swift 中有 String? 和 String! 两种形式,但 OC 中没有 NSString? 和 NSString! ,当 Swift 无法区分 OC 中的变量是不是 nil 的时候,一律强行转化为非空参数。这样设计体现了 Swift 强安全性语言的特性。

但是这时候问题来了。我们回到上文中的例子,假如 OC 中对 foo的使用如下:

@property (nonatomic, copy) NSString *foo;

- (void)secretFunc {  
 // 一些诡异复杂的操作  ...  
 self.foo = nil; }

然后我们在 Swift 中这样调用:

func init() {
  objectiveCObject.secretFunc()

}func calcLen() -> Int {  

网友评论