我在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);
}
}
}
答案 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 }
这个例子定义了两个简单的数学函数
addTwoInts
和multiplyTwoInts
。这些函数每个都需要两个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)
}
}
}