这是我在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)!
调用方法时,我理解!
运算符将强制解包一个可选项。但是在这种情况下,预期参数类型中!
的含义是什么?
答案 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头文件中。您标记为可为空的属性将是常规选项,其余属于非选项。