如何在Java接口中快速使用闭包

时间:2017-06-15 12:43:51

标签: java swift interface closures

我在java中有一个硬编码的snipet代码,如下所示。如何使用协议或其他快速的东西在Swift 3上重写此代码。

interface Startable {
 int started(String name);
}

class A{
    private String name;
    private Startable startable;

    public A(String name, Startable startable) {
        name = name;
        startable = startable;
    }

    public void doSomething() {
        if (startable != null) {
            startable.started(name);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

在您的Java示例中,Startable是一个"功能接口"在Swift中,它被称为"功能类型"我认为这就是Closure的含义,请参阅"功能类型" Swift Functions中的部分。

来自Swift文档:

  

功能类型

     

每个函数都有一个特定的函数类型,由参数组成   类型和函数的返回类型。

     

例如:

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
    return a * b
}
     

这个例子定义了两个简单的数学函数   addTwoIntsmultiplyTwoInts。这些函数每个都需要两个Int   值,并返回一个Int值,这是执行一个的结果   适当的数学运算。

     

这两个函数的类型是(Int, Int) -> Int

     

...

     

使用功能类型

     

您可以像使用Swift中的任何其他类型一样使用函数类型。对于   例如,您可以将常量或变量定义为函数   输入并为该变量分配适当的函数:

var mathFunction: (Int, Int) -> Int = addTwoInts
     

这可以理解为:

     

“定义名为mathFunction的变量,其类型为" a   功能"这需要两个Int值,并返回Int值。   设置此新变量以引用名为addTwoInts的函数。“

     

...

如果你想和你的java示例完全一样,那么你可以用Swift写作

class A {

    var name : String
    var startable : ((String) -> Int)?

    init(_ name : String, _ startable : ((String) -> Int)?) {
        self.name = name
        self.startable = startable
    }

    func doSometing() {
        if let fn = startable {
           fn(name)
        }
    }   
}