[英]How use closures in swift like Java interfaces
我在Java中有如下代碼的硬編碼代碼段。 如何使用協議或其他Swift東西在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);
}
}
}
在您的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
的變量,該變量的類型為“函數”,它接受兩個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)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.