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 块的主要内容,如果未能解决你的问题,请参考以下文章

Swift(08)- 函数

如何将 Objective-C 的完成块转换为 Swift?

将objective-c块转换为Swift闭包

在swift文件中调用objective-C属性块,完成块属性变为零

Swift基础语法

将 Objective-C 方法转换为 Swift [关闭]