使用 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 AnyPromise
(PMKPromise
是 AnyPromise
的已弃用别名:首选 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