繁体   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