2017-06-15 19 views
-2

我在下面的java中有一段硬編碼的代碼snipet。我怎樣才能使用協議或其他快速的東西在Swift 3上重寫這段代碼。如何在Java接口中使用快速閉包

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); 
     } 
    } 
} 
+2

你嘗試過這麼遠嗎?請展示您在Swift中實現它的嘗試,以及您遇到的問題。 – Hamish

回答

2

在你的Java實例Startable是一個「功能接口」,它來到旁邊的斯威夫特被稱爲「功能型」,我認爲這是你的意思與Closure,請參見「函數類型」一節Swift Functions

從斯威夫特文檔:

功能類型

每個函數都有特定的功能類型,由參數 類型和函數的返回類型。

例如:

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

...

使用功能類型

您可以使用函數類型,就像任何其他類型的斯威夫特。對於 例如,可以定義一個常數或變量是一個函數 類型的,並且分配一個適當的函數,以該變量:

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

這可以被理解爲:

「定義了一個名爲mathFunction可變,其具有類型「一個 函數」,它有兩個Int值,並返回一個Int值。」 設置這個新變量來指稱爲addTwoInts的功能。」

...

如果你想要做的完全一樣在你的java例子,那麼你可以在斯威夫特寫爲

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) 
     } 
    } 
}