【问题标题】:Bridging from Objective C to Swift with PromiseKit使用 PromiseKit 从 Objective C 到 Swift 的桥接
【发布时间】: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'”

【问题讨论】:

  • 嗯,好吧,但我很确定这并不像只知道声明那么简单,因为还有#defines 和其他桥接魔术。 - (AnyPromise *(^)(id))then;
  • 好吧,我让你失望了。 :( 对不起。
  • 您是否创建了桥接头?
  • @Steve 是的,有一个桥接头

标签: objective-c swift promisekit


【解决方案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 添加]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多