【问题标题】:Swift pass block from Objective-C to Swift从 Objective-C 到 Swift 的 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 ....

标签: objective-c swift bridging-header


【解决方案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)"
*/

【讨论】:

  • 亲爱的选民,请解释一下您的决定,以便我下次满足您的要求。提前谢谢你!
猜你喜欢
  • 2018-04-09
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多