Swift 相当于我的 Objective-C 块
Posted
技术标签:
【中文标题】Swift 相当于我的 Objective-C 块【英文标题】:Swift equivalent of my Objective-C block 【发布时间】:2018-01-08 23:34:02 【问题描述】:我似乎不知道如何从 Swift 调用 Objective-C 块!
我有以下 Objective-C 方法:
- (void)myMethod:(NSDictionary *)selection success:(MyBlock)success;
MyBlock 在哪里:
typedef void(^MyBlock)(BOOL success, NSDictionary* options);
它要么抱怨它不能投射:
"Cannot convert value of type '(Bool, Dictionary<AnyHashable, Any>) -> ()' to expected argument type 'MyBlock!' (aka 'ImplicitlyUnwrappedOptional<(Bool, Optional<Dictionary<AnyHashable, Any>>) -> ()>')"
或者当我尝试使用以下任何一种方法从 Swift 调用该方法时,我得到了一个 SIGABRT:
myInstance.myMethod(myOptions) (success, options) in
...
myInstance.myMethod(myOptions) (success: Bool, options: Dictionary<AnyHashable, Any>?) in
...
myInstance.myMethod(myOptions) (success: Bool!, options: [AnyHashable: Any]?) in
...
myInstance.myMethod(myOptions, success: (success, options) in
...
)
myInstance.myMethod(myOptions, success: (success, options) in
...
as MyBlock)
myInstance.myMethod(myOptions, success: (success: Bool, options: Dictionary<AnyHashable, Any>?) in
...
)
myInstance.myMethod(myOptions, success: (success: Bool!, options: Dictionary<AnyHashable, Any>?) in
...
)
myInstance.myMethod(myOptions, success: (success: Bool!, options: Dictionary<AnyHashable, Any>?) in
...
as MyBlock)
myInstance.myMethod(myOptions, success: (success: Bool!, options: [AnyHashable: Any]?) in
...
)
myInstance.myMethod(myOptions, success: (success: Bool, options: [AnyHashable: Any]?) in
...
)
我该怎么办?
【问题讨论】:
能否提供一个最小的示例项目,让我们轻松测试和尝试事物? 我已经上传了一个简单的演示应用程序到:github.com/ChrisAllinson/iosBridgeExample ...但它似乎工作:| ...也许我的其他应用程序的问题在于投射/分配,因为它确实抱怨说它试图投射到“ImplicitlyUnwrappedOptional”......想法? 你运行的是什么版本的 Swift?这在 Swift 3.2 下编译得很好,这是我的 Xcode 版本支持的最低版本 对,这个简单的演示应用确实可以工作……但我正在开发的另一个应用却不行。我很困惑,想知道为什么它认为它是“ImplicitlyUnwrappedOptional”......任何熟悉的人? (感谢您的帮助)! Ohhh 似乎可以工作”,没看到。您的原始应用程序使用的是哪个版本的 Swift?ImplicitluunwrappedOptional
是存在 before Swift 3 的类型
【参考方案1】:
MyBlock 的等效 swift 代码:
typedef void(^MyBlock)(BOOL success, NSDictionary* options)
- (void)myMethod:(NSDictionary *)selection success:(MyBlock)success;
如下:
public typealias MyBlock = (Bool, [String : Any]) -> (Void)
func myMethod(selection: [String : Any], success: MyBlock)
所以当你使用 myMethod 例如:
self.myMethod(selection: yourDictionary) (success, options) -> (Void) in
//handle here
【讨论】:
以上是关于Swift 相当于我的 Objective-C 块的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Objective-C 的完成块转换为 Swift?