使用 PromiseKit 从 Objective C 到 Swift 的桥接

Posted

技术标签:

【中文标题】使用 PromiseKit 从 Objective C 到 Swift 的桥接【英文标题】:Bridging from Objective C to Swift with PromiseKit 【发布时间】:2015-07-05 16:39:44 【问题描述】:

将 PromiseKit 2.0 与 Swift 1.2 结合使用,我正在尝试使用在 Swift 的 Objective C 中创建的 PMKPromise。

目标 C 代码:

@interface FooTest : NSObject
+ (PMKPromise *)promise;
@end

Swift 代码(我尝试了多种变体,但都不起作用。这个最接近http://promisekit.org/PromiseKit-2.0-Released/ 给出的示例):

FooTest.promise().then  (obj: AnyObject?) in
    self.obj = obj

编译器错误:无法使用类型为“((AnyObject?) -> _)”的参数列表调用“then”

这也不起作用:

FooTest.promise().then  (obj: AnyObject?) -> AnyPromise in
    return AnyPromise()

类似错误:“无法使用类型为 '((AnyObject?) -> AnyPromise)' 的参数列表调用 'then'”

【问题讨论】:

代码在这里:github.com/mxcl/PromiseKit/blob/master/Sources/AnyPromise.h 嗯,好吧,但我很确定这并不像只知道声明那么简单,因为还有#defines 和其他桥接魔术。 - (AnyPromise *(^)(id))then; 好吧,我让你失望了。 :( 对不起。 您是否创建了桥接头? @Steve 是的,有一个桥接头 【参考方案1】:

PromiseKit 中有两种不同的 Promise 类,一种用于 Swift (Promise<T>),另一种用于 ObjC (AnyPromise)。 Swift 是泛型的,而 Objective-C 看不到泛型类,所以这就是为什么有两个。

如果 Foo.promise() 打算在 ObjC 和 Swift 中使用,那么你做对了。但是,如果您只打算在 Swift 中使用此承诺,那么我建议将其重写为 Promise<T>

要在 Swift 代码中使用 Objective-C AnyPromisePMKPromiseAnyPromise 的已弃用别名:首选 AnyPromise),您必须将其拼接到现有链中。

someSwiftPromise().then  _ -> AnyPromise in
    return someAnyPromise()
.then  (obj: AnyObject?) -> Void in
    //…

应该有一种从 AnyPromise 开始的方法,我可能会在今天晚些时候添加:

someAnyPromise().then  (obj: AnyObject?) -> Void in
    //…

期待 2.1 更新。 [编辑:2.1 推送了上面的then 添加]

【讨论】:

以上是关于使用 PromiseKit 从 Objective C 到 Swift 的桥接的主要内容,如果未能解决你的问题,请参考以下文章

PromiseKit AnyPromise 然后崩溃 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000010

从 PromiseKit/Alamofire 返回一个 Promise

在 PromiseKit 6 中正确链接多个 Promise

从 PromiseKit 中的完成处理程序返回 Promise

然后在 Promisekit 中重新加载 tableview

AFNetworking/Overcoat/Promisekit - 在错误消息中获取返回 json