Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用闭包类型的原始值在Swift中创建枚举?_Swift_Enums - Fatal编程技术网

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

是否可以使用闭包类型的原始值在Swift中创建枚举?,swift,enums,Swift,Enums,当我尝试下面的代码时,我得到了一些错误 enum Operate: ((Double, Double) -> Double) = { case Plus = {$1 + $0} case Minus = {$1 - $0} case Multiply = {$1 * $0} case Divide = {$1 / $0} } 是否可以使用闭包类型的原始值在Swift中创建枚举? 谢谢。正如@Pang所说,只有字符串、字符或任何浮点数类型的整数可以用作原始

当我尝试下面的代码时,我得到了一些错误

enum Operate: ((Double, Double) -> Double) = {
    case Plus = {$1 + $0}
    case Minus = {$1 - $0}
    case Multiply = {$1 * $0}
    case Divide = {$1 / $0} 
}
是否可以使用闭包类型的原始值在Swift中创建枚举?
谢谢。

正如@Pang所说,只有字符串、字符或任何浮点数类型的整数可以用作原始类型。但是,您可以使用
结构实现类似的功能:

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语言iBook,了解有关枚举关联值的更多信息。

正如@Duncan C所指出的,您可以创建一个
enum
,其中每个案例都有一个关联值,如下所示:

    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

我猜答案是否定的。如果是将来,请确保在问题本身中包含你所犯的任何错误。这在这里可能是完全不相关的,但考虑到你是来问问题的,最好提供尽可能多的细节。此外,它改进了搜索结果,并可能有助于识别重复的问题。这显然是编译的,但我不确定它是否符合OP的要求,这可能是一个包含(&returns)的
enum
变量在
init
时间选择了正确的闭包-他可以将它放入一个更复杂的结构中,比如
struct CalculatorButton{var button:UIButton;var operate:operate}
也许OP可以澄清他在尝试什么?我同意,如果OP可以澄清,那就好了。如果他们打算储存一项作业;一个选项是存储
OperationType
的闭包,并使用
Operate
类分配操作。但是,如果OP需要比较操作,这将不是一个合适的解决方案。这种类型的逻辑对于创建计算器应用非常有用!我想你不是指
尿
手术:)