簡體   English   中英

如何使用這樣的閉包參數初始化結構?

[英]How can you initialize a struct with a closure parameter like this?

在我今天看到的這個問題中,它定義了一個結構Effect ,它有一個屬性run ,它是一個帶有通用參數的閉包:

struct Effect<T> {
    let run: (@escaping (T) -> Void) -> Void
}

然后示例代碼創建一個Effect<Int>的實例,並使用類似於尾隨閉包語法的東西指定run屬性的閉包:

let anIntInTwoSeconds = Effect<Int> { callback in
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        callback(42)
    }
}

是什么讓這合法? 我希望需要在調用 init 方法時明確指定 run 參數:

let anIntInTwoSeconds = Effect<Int>(run: { callback in
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        callback(42)
    }
}
)

任何一個版本都可以編譯和工作。 Swift 中的什么使第一個版本合法? 我無法弄清楚如何構建問題以便我可以搜索答案。

這就像任何 function 一樣,其最后一個參數是 function。 尾隨閉包語法是尾隨閉包語法。 function 是初始化程序這一事實並沒有改變。

因此,讓我分階段進行。 你知道你可以說:

func myfunc(whatever: () -> ()) {}
myfunc {}

好的,但現在讓我們將其設為 static 方法:

struct S {
    static func myfunc(whatever: () -> ()) {}
}
S.myfunc {}

好的,但是init一個 static 方法——它只是一個 static 方法,您可以省略其名稱:

struct S {
    let whatever: () -> ()
}
S {} // meaning S.init {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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