簡體   English   中英

如何像Java接口一樣快速使用閉包

[英]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 } 

這個例子定義了兩個簡單的數學函數調用addTwoIntsmultiplyTwoInts 這些函數各自采用兩個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM