使用PromiseKit从Objective C桥接到Swift

Tim*_*man 2 objective-c swift promisekit

使用PromiseKit 2.0和Swift 1.2,我试图使用在Swift的Objective C中创建的PMKPromise.

目标C代码:

@interface FooTest : NSObject
+ (PMKPromise *)promise;
@end
Run Code Online (Sandbox Code Playgroud)

Swift代码(我尝试了很多变种,但没有一个变化.这个变化最接近http://promisekit.org/PromiseKit-2.0-Released/上给出的例子):

FooTest.promise().then { (obj: AnyObject?) in
    self.obj = obj
}
Run Code Online (Sandbox Code Playgroud)

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

这也不起作用:

FooTest.promise().then { (obj: AnyObject?) -> AnyPromise in
    return AnyPromise()
}
Run Code Online (Sandbox Code Playgroud)

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

mxc*_*xcl 5

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

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

要在Swift代码中使用Objective-C AnyPromise(PMKPromise是一个弃用的别名AnyPromise:prefer AnyPromise),您必须将它拼接成现有的链.

someSwiftPromise().then { _ -> AnyPromise in
    return someAnyPromise()
}.then { (obj: AnyObject?) -> Void in
    //…
}
Run Code Online (Sandbox Code Playgroud)

这里应该是从AnyPromise起动方式,很可能我会在今天晚些时候补充一点:

someAnyPromise().then { (obj: AnyObject?) -> Void in
    //…
}
Run Code Online (Sandbox Code Playgroud)

期待2.1更新.[编辑:2.1推上以上then添加]