当我尝试以下代码时,我得到了一些错误。
enum Operate: ((Double, Double) -> Double) = {
case Plus = {$1 + $0}
case Minus = {$1 - $0}
case Multiply = {$1 * $0}
case Divide = {$1 / $0}
}
有可能在Swift中创建一个闭包的原始值类型的Enum吗?谢谢。
如@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
另一种可能的方法,但使用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)
原始值不能是闭包,但枚举还有另一种选择。
枚举支持一个关联值,该值可以保存任何类型。您可以使用关联值来存储闭包。有关枚举相关值的更多信息,请参阅Swift Language iBook。
正如@Duncan C指出的那样,您可以创建一个enum
,而不是使用原始类型创建enum
,其中每个case都有一个相关的值,如下所示:
private enum Operation {
case BinaryOperation((Double, Double) -> Double)
case UrinaryOperation((Double) -> Double)
}
关联值的类型在每个大小写旁边的括号中。与原始值不同,关联值可以是闭包。
然后,您可以创建一个带有(Double, Double) -> Double
类型关联值的Operation类型变量:
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