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