是否可以使用原始值类型的闭包在Swift中创建Enum?

时间:2015-05-24 10:56:30

标签: swift enums

当我尝试使用代码时,我遇到了一些错误。

enum Operate: ((Double, Double) -> Double) = {
    case Plus = {$1 + $0}
    case Minus = {$1 - $0}
    case Multiply = {$1 * $0}
    case Divide = {$1 / $0} 
}

是否可以使用原始值类型的闭包在Swift中创建Enum? 感谢。

4 个答案:

答案 0 :(得分:7)

正如@Pang所说,只有字符串,字符或任何整数的浮点数类型都可以用作原始类型。但是,您可以使用struct

实现类似的功能
struct Operate {
    typealias OperationType = (Double, Double) -> Double

    static let Plus : OperationType = { $0 + $1 }
    static let Minus: OperationType = { $0 - $1 }
    // ...
}

let plus = Operate.Plus
plus(1.0, 2.0) // 3.0

答案 1 :(得分:5)

另一种可能的方法,但使用enum

typealias TwoOp = (Double, Double) -> Double

enum Operate {

    case Plus, Minus // etc...

    var op: TwoOp {
        get {
            switch self {
            case .Plus:
                return {$1 + $0}
            case .Minus:
                return {$1 - $0}
            }
        }
    }
}

let opPlus = Operate.Plus
let answerP = opPlus.op(3, 2)
let opMinus = Operate.Minus
let answerM = opMinus.op(3, 2)

答案 2 :(得分:1)

原始值不能是闭包,但枚举还有另一种选择。

枚举支持可以包含任何所需类型的关联值。您可以使用关联值来存储闭包。有关枚举相关值的更多信息,请查看Swift语言iBook。

答案 3 :(得分:1)

正如@Duncan C指出的那样,不是用原始类型创建enum,而是创建enum,其中每个案例都有一个关联值,如下所示:

    private enum Operation {
            case BinaryOperation((Double, Double) -> Double)
            case UrinaryOperation((Double) -> Double)
        }

相关值的类型位于每个案例旁边的括号中。与原始值不同,关联值可以是闭包。

然后,您可以创建一个类型为Operation的变量,其关联值为(Double, Double) -> Double

let plus = Operation.BinaryOperation({$0 + $1})
let minus = Operation.BinaryOperation({$0 - $1})
let multiply = Operation.BinaryOperation({$0 * $1})
let divide = Operation.BinaryOperation({$0 / $1})
let plus = Operation.BinaryOperation({$0 + $1})

let abs = Operation.UrinaryOperation({abs($0)})

并使用它们:

plus(3.0,2.0) //5.0
abs(-4.0)     //4.0