从 Objective-C 到 Swift 的 Swift 传递块

Posted

技术标签:

【中文标题】从 Objective-C 到 Swift 的 Swift 传递块【英文标题】:Swift pass block from Objective-C to Swift 【发布时间】:2015-12-07 10:40:43 【问题描述】:

我在 Objective-C 中有一个方法,它接受一个参数并在一个块中返回一个结果。如何通过桥接头将此结果返回到 swift 块?注意我有其他非阻塞函数返回,这工作正常。

目标-C

   - (void)performMethod:(NSString*)myString
        
        [self.class
         doSomething:myString
         onSuccess:^(NSArray * results) 
           // Return results
         
         onFailure:^(NSError * error) 
           // Return error
         ];
    

桥接头

?

斯威夫特

class.performMethod(myString:String)->(results) in NSArray 


【问题讨论】:

... 接受一个参数并在一个块中返回一个结果... ???您的函数只返回 void。 这就是问题 - performMethod 应该如何构造,以便我可以通过桥接头将块中的结果返回给 swift 方法。我引用的块在 onSuccess 内: 再次检查我的“笔记”。你objectiv c函数不返回任何块。它返回无效。您将什么声明为您的 swift 代码的“原型”与您的目标 c 代码无关。你问如何将你的目标代码“翻译”成 swift? 您熟悉桥接头的概念吗?随意调整objective-c函数,使onSuccess或onFailure中的结果通过performMethod方法返回。 是的,我是。您想编写一些与您的 swift 代码具有相同签名的目标 c 函数吗?或者你想做什么?我很抱歉,但你的问题是“我在 Objective-C 中有一个方法,它接受一个参数并在一个块中返回一个结果。如何通过桥接头将此结果返回到一个快速块?”所以唯一的答案是,你的函数不返回任何东西,而是 void .... 【参考方案1】:

问题在于您的 Objective C 函数返回 void,而不是某个块

如何快速处理阻塞?看下面的例子

// this block takes an Int as parameter and returns an Int
let myBlock: (Int)->Int =  i in
    return i

let i = myBlock(10)
print(i) // 10
// this block takes no parameters and return an empty Array<Int>
let myBlock2: ()->Array<Int> =  Void in
    return [Int]()

print(myBlock2.dynamicType) // () -> Array<Int>
let arr = myBlock2()
print(arr, arr.dynamicType) // [] Array<Int>

从我在您的代码中可以看到,您尝试执行类似的操作

import Foundation

func bar(str: String, onSucces: ()-> NSArray, onError: ()->NSError) 
    // do something with str
    if str == "alfa" 
        // success
        let arr = onSucces()
        print(arr)
     else 
        let err = onError()
        print(err)
    


func foo(str: String) -> Void 
    bar(str, onSucces:  () -> NSArray in
        return NSArray(array: [str])
        )  () -> NSError in
            return NSError(domain: "error", code: -1, userInfo: nil)
    


foo("alfa")
/*
(
alfa
)
*/

foo("")
/*
Error Domain=error Code=-1 "(null)"
*/

【讨论】:

亲爱的选民,请解释一下您的决定,以便我下次满足您的要求。提前谢谢你!

以上是关于从 Objective-C 到 Swift 的 Swift 传递块的主要内容,如果未能解决你的问题,请参考以下文章

从 Objective-C 到 Swift 的 Swift 传递块

《程序员》杂志精选:从Objective-C到Swift

将数据从 Swift 控制器传递到 Objective-C 控制器

从Objective-C到Swift的UITextView类,intrinsicContentSize问题[关闭]

从Objective-C向Swift转换学习到的经验

从 Objective-C 迁移到 Swift:AFNetworking > Alamofire