从 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 传递块
将数据从 Swift 控制器传递到 Objective-C 控制器