Swift中的匿名内部类

时间:2015-03-17 09:18:23

标签: ios objective-c iphone swift

在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()?

2 个答案:

答案 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()
    }
}