Objective C到Swift的桥接:使用PromiseKit

3
使用 Swift 1.2 版本的 PromiseKit 2.0,我尝试在 Swift 中使用从 Objective-C 创建的 PMKPromise。
Objective-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()
}

类似错误:"Cannot invoke 'then' with an argument list of type '((AnyObject?) -> AnyPromise)'"

代码在这里:https://github.com/mxcl/PromiseKit/blob/master/Sources/AnyPromise.h - Tim Norman
嗯,好的,但我相信这并不像只知道声明那么简单,因为还涉及到#define和其他桥接魔法。- (AnyPromise *(^)(id))then; - Tim Norman
抱歉,我让你失望了。:( 对不起。 - matt
你创建了桥接头文件吗? - Steve
@Steve 是的,有一个桥接头文件。 - Tim Norman
据我所知,PromiseKit似乎还没有为Swift做好准备(这只是我的观点,在放手之前请听我说)。then调用仍然使用id来允许传递多种类型的块;在Swift中,这可能应该通过重载then并使用正确的类型签名来完成。我会尝试寻找解决方案一段时间,但这似乎很难处理。 - DanZimm
1个回答

6
在PromiseKit中有两个不同的Promise类,一个是针对Swift (Promise<T>),另一个是针对ObjC (AnyPromise)。Swift的Promise是通用的,而Objective-C无法看到通用类,这就是为什么需要这两个类的原因。
如果Foo.promise()既要在ObjC中使用,又要在Swift中使用,则您正在做正确的事情。但是,如果您只打算在Swift中使用此Promise,则建议将其重写为Promise<T>
要在Swift代码中使用Objective-C的AnyPromise (PMKPromiseAnyPromise的过时别名:请优先使用AnyPromise),您必须将其拼接到现有的链中。
someSwiftPromise().then { _ -> AnyPromise in
    return someAnyPromise()
}.then { (obj: AnyObject?) -> Void in
    //…
}

应该有一种方法可以从AnyPromise开始,也许我今天稍后会添加这个功能:

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

预计会有2.1版本的更新。[编辑:已经推出带有上述then的2.1版本]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接