簡體   English   中英

在Swift中使用函數作為關聯值了解枚舉

[英]Understanding Enums with Functions as Associated Values in Swift

我目前正在嘗試了解將功能/閉包作為關聯值的enums的目的和用法。 我確實理解enums值的目的如下...

enum Homework{
    case InProgress(Int, Int)
    case Complete
}

let load = Homework.InProgress(50, 100)

switch load {
    case .InProgress(let done, let total):
        print("\(done) out of \(total)")

    case .Complete:
        print("complete")
}

我不了解將閉包作為emum的值的目的以及如何使用它。

有人可以解釋將閉包與枚舉關聯的主要目的嗎?

您將在何處以及如何使用類似以下代碼的內容? 有人可以舉個簡單的例子嗎?

enum SomeEnum{
    case ClosureOne (String, Double-> Double)
    case ClosureTwo (String, (Double, Double) ->Double)
}

謝謝

正如@ luk2302所指出的,從字面上看,尋找隨機類型的用例實際上是“一種解決問題的解決方案”。 但這也許有助於擴大人們對可能的想法。

也就是說,將函數嵌入枚舉與其他任何函數參數一樣有用。 例如,您可以使用它以錯誤類型傳遞恢復函數:

enum Error: ErrorType {
    case Temporary(message: String, recovery: () -> Void)
    case Final(message: String)
}

func reconnect() {}

let err = Error.Temporary(
    message: "Network down",
    recovery: { reconnect() }
)

switch err {
case let .Temporary(message, recovery):
    print(message)
    recovery()
case let .Final(message):
    print(message)
    fatalError()
}

或者,您可以在任何狀態機中傳遞“如何轉換為下一個狀態”(這對於枚舉是非常普遍的用法)。

enum State {
    case Login(next: (password: String) -> State)
    case Connecting(next: (Connection) -> State)
    case Connected(next: (Connection) -> State)
    case Disconnected(next: () -> State)
}

這將允許每個狀態轉換直接控制下一個狀態轉換,在某些情況下,這比使所有邏輯集中化更好(特別是如果合法轉換取決於路徑)。

但是,正如@ luk2302所說,函數值只是值。 如果枚舉可以包含除函數以外的任何值,那將是非常不幸的特殊情況。

我認為,當您想乘以某個數字時,可以使用枚舉和閉包。 這可能不是最好的例子,當然也不是唯一的解決方案,但我認為將閉包與枚舉關聯可能是一個案例。

enum Operation{
    case AddBy (String, Double-> Double)
    case MultiplyBy (String, Double-> Double)
}


let multiplyByThree = Operation.MultiplyBy("Multiply", {(let num)-> Double in return num * 3})
let AddByThree = Operation.AddBy("Add", {(let num)-> Double in return num + 3})

switch multiplyByThree{

    case .MultiplyBy(let operation, let byNumber):

        print("\(operation) by Three =  \(byNumber(10))")

    case .AddBy(let operation, let byNumber):
        print("\(operation) by Three = \(byNumber(10))")
}

暫無
暫無

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

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