来自 威尼斯国际官方网站 2019-09-16 09:40 的文章
当前位置: 威尼斯国际官方网站 > 威尼斯国际官方网站 > 正文

威尼斯国际官方网站:强制解包看,从强制解包

不知道我们有未有觉察,在一个 Objective-C 和 Swift 混编的 App 中,当把贰个 OC 中的参数转到 斯威夫特 时,斯维夫特会自动把那一个变量举行强制解包。比如,小编在 OC 中定义这样三个变量:

威尼斯国际官方网站 1

 1 @property (nonatomic, copy) NSString *foo; 

不精通大家有未有觉察,在四个 Objective-C 和 斯维夫特 混编的 App 中,当把一个 OC 中的参数转到 斯维夫特 时,Swift会自动把那么些变量举办强制解包。比如,笔者在 OC 中定义那样叁个变量:

它转成 斯威夫特 就成为了那样:

@property (nonatomic, copy) NSString *foo;
var foo: String!

它转成 斯威夫特 就成为了那样:

如此看起来合理。Swift 中有 String? 和 String! 两种样式,但 OC 中从不 NSString? 和 NSString! ,当 斯维夫特 不能够区分 OC 中的变量是否 nil 的时候,一律强行转会为非空参数。那样设计展示了 Swift强安全性语言的风味。

var foo: String!

不过此时难题来了。大家重回上文中的例证,假设 OC 中对 foo的运用如下:

与此相类似看起来合理。斯威夫特 中有 String? 和 String! 二种样式,但 OC 中平昔不 NSString? 和 NSString! ,当 斯威夫特 不能区分 OC 中的变量是否 nil 的时候,一律强行转会为非空参数。那般设计呈现了 Swift强安全性语言的风味。

 1 @property (nonatomic, copy) NSString *foo;
 2 
 3 - (void)secretFunc {  
 4   // 一些诡异复杂的操作
 5   ...  
 6   self.foo = nil;
 7 }
 8 // 然后我们在 Swift 中这样调用:
 9 
10 func init() {
11   objectiveCObject.secretFunc()
12 }func calcLen() -> Int {  
13 
14   return objectiveCObject.foo.characters.count
15 
16 }

只是此时难题来了。大家回去上文中的事例,纵然 OC 中对 foo的行使如下:

地点这段 Swift代码实施到calcLen()时会崩溃,原因是fooinit()中一度被设成了 nil,而foo在 Swift 中是 foo!。也正是说,因为 Swift 对 OC 变量的强转,导致了程序的崩溃。那是三个很轻易忽略的难点,因为强转的时候,Xcode 不会付出任何的告诫、报错或是提醒。而笔者辈作为开荒者,很轻便忽视那样的一无所长,导致 runtime 的时候一直崩溃。

@property (nonatomic, copy) NSString *foo;- secretFunc { // 一些诡异复杂的操作 ... self.foo = nil;}

本着这种景色,我们来研讨上面多个难题。

下一场我们在 斯威夫特 中如此调用:

  • Q: 为啥 斯维夫特 要将 OC 中的变量如foo转为foo!而不是foo?
func init() { objectiveCObject.secretFunc()}func calcLen() -> Int { return objectiveCObject.foo.characters.count}

那是一个有争持的话题。作者个人以为强制解包的形式会催促开荒者思量变量是还是不是为 nil 的主题材料。在 OC 时期,注脚变量一般不会挂念是或不是为空的难点;而在 斯维夫特时期,因为其是一门强安全性的言语,在变量定义时,必需鲜明变量是还是不是为空。一般定义为非空有二种以下格局:

地点这段 Swift代码实施到calcLen()时会崩溃,原因是fooinit()中已经被设成了 nil,而foo在 Swift 中是 foo!。也正是说,因为 Swift 对 OC 变量的强转,导致了前后相继的崩溃。那是一个很轻易忽略的主题材料,因为强转的时候,Xcode 不会付出任何的警戒、报错或是提示。而大家作为开拓者,很轻易忽视那样的不当,导致 runtime 的时候一贯崩溃。

1 // force unwrapping
2 var foo = "Hello"
3 // implicitly unwrapping
4 var foo: String!

本着这种气象,大家来研讨上面四个问题。

前端依照开始值强制解包,定义 foo 为非空变量;后面一个则一贯表明 foo 为非空变量。

  • Q: 为啥 Swift 要将 OC 中的变量如foo转为foo!而不是foo?

本文由威尼斯国际官方网站发布于威尼斯国际官方网站,转载请注明出处:威尼斯国际官方网站:强制解包看,从强制解包

关键词: