2016-01-22 49 views
-1

我目前正試圖瞭解enums的目的和用法,它將函數/閉包作爲關聯值。我明白enums控股值的目的,遵循...瞭解帶函數的函數作爲Swift中的關聯值

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

感謝

+2

誰說這實際上曾經使用/有一個原因?關閉與「普通」類型(例如'5'或'「hello」')沒有任何區別。僅僅因爲你*可以做到這一點並不意味着它實際上有任何用處。但是更糟糕的是,不允許在這裏關閉,因爲*那*完全沒有理由。 – luk2302

回答

2

正如@ 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) 
} 

這將使每個狀態轉換到直接控制的下一個狀態的轉換,這在某些情況下是比構成所有邏輯集中式(尤其是如果法律過渡是路徑depenedent)更好。

但是,正如@ luk2302所說,函數值只是值。如果枚舉可能包含任何價值但功能,那將是一個非常不幸的特例。

+0

謝謝你的例子。 –

0

我認爲,當你想例如乘,加等通過一定數目,你可以使用枚舉與關閉。這可能不是最好的例子,當然這不是唯一的解決方案,但我認爲將閉包與枚舉相關聯可能是一種情況。

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