在Java中,我可以执行以下操作:
interface SomeCallback {
void onDone();
}
然后我可以创建一个这样的函数:
void test(SomeCallback callback) {
...
}
要调用此功能,我会这样做:
test(new SomeCallback() {
@Override
void done() {
...
}
});
我想在Swift中做类似的事情。我可以创建一个协议
protocol SomeCallback : class {
func done()
}
和这样的函数
func test(callback: SomeCallback) {
...
}
我仍然在努力调用这个函数。
编辑:因为我使用需要委托的外部API,所以我不能使用Closure。
是否有可能创建某种匿名内部类,就像我在Java示例中所做的那样调用test()?
答案 0 :(得分:2)
更新:如果你不能使用闭包/函数,直接答案是:不,没有匿名内部类。但是,as Mike M points out,您必须使用一个类,并且此类可能是嵌套/内部的,以防止污染全局命名空间。对于需要实现的每个方法,这个类可能都有一个闭包,只需调用那些闭包。
只要你需要一个方法,Swift-y的方法就是使用lambda / closure。
例如,请参阅NSComparator
,它是typealased的,因为它在整个地方使用,你打算识别它。
在您的示例中,指定内联函数类型会很好。例如:
func test(callback: () -> Void) {
...
callback()
}
// called as:
test({ in
...
})
// or even (since it's the last parameter)
test { in
...
}
答案 1 :(得分:0)
只是为了澄清语法,因为你写的内容有点令人困惑。
@objc protocol SomeCallback {
func done() -> Void
}
不需要像你写的那样从类继承。此外,即使您不想将协议桥接到该语言,也不要忘记@objc。它有助于稍后编译器投诉(目前可能是一个错误)
您无法在Swift中实例化协议。但是,您可以拥有一个继承自NSObject(根对象)的内部类并实现它。
class External: NSObject {
class Internal : SomeCallback {
func done() {
// does something
}
}
let int = Internal()
func test(callback : SomeCallback) {
// additional work
callback.done()
}
}