强制解包在预期的参数类型中意味着什么?

时间:2016-01-07 04:44:14

标签: objective-c xcode swift

这是我在Swift中的代码行,它调用了一个方法:

networkManager.postUserProfile(self, onSuccess: {(username: String, userID: NSNumber, recommendedLessons: [AnyObject]) -> Void in
    ... code block
}, onFailure: {(error: NSError) -> Void in
    ... another code block
})

networkManager类来自Objective-C,是:

- (void)postUserProfile:(Profile *)profile
              onSuccess:(void(^)(NSString *username, NSNumber *userID, NSArray *recommendedLessons))successBlock
              onFailure:(void(^)(NSError *error))failureBlock;

错误信息是:

  

错误:无法将类型(String, NSNumber, [AnyObject]) -> Void的值转换为预期的参数类型((String!, NSNumber!, [AnyObject]!) -> Void)!

调用方法时,我理解!运算符将强制解包一个可选项。但是在这种情况下,预期参数类型中!的含义是什么?

1 个答案:

答案 0 :(得分:2)

有许多优秀的现有答案(such as these)解释了隐式解包的选项是什么以及为什么使用它们,所以我不会讨论它。

Objective-C头文件中的对象指针类型在Swift中被视为隐式解包的选项,因为编译器不知道nil是否是有效值。

如果在传递给postUserProfile的块中的每个类型后添加感叹号,则应编译代码:

networkManager.postUserProfile(self, onSuccess: { (username: String!, userID: NSNumber!, recommendedLessons: [AnyObject]!) -> Void in
    ... code block
}, onFailure: { (error: NSError!) -> Void in
    ... another code block
})

但是,更好的解决方案是将nullability annotations添加到Objective-C头文件中。您标记为可为空的属性将是常规选项,其余属于非选项。