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 - Fatal编程技术网

Swift 快速函数数组

Swift 快速函数数组,swift,Swift,我对斯威夫特很陌生,但我会慢慢地学习。我有一个关于在数组中存储和调用函数的问题 下面的代码似乎正确地存储了该函数,但当我尝试调用其中一个函数时,出现了以下错误:“IntegerLiteralConvertible,IntegerLiteralConvertible->$T6”与String不同,Op 我发现这有助于我达到现在的状态,但现在我陷入了困境 enum Op { case binary((Double, Double) -> Double) } var ops = [St

我对斯威夫特很陌生,但我会慢慢地学习。我有一个关于在数组中存储和调用函数的问题

下面的代码似乎正确地存储了该函数,但当我尝试调用其中一个函数时,出现了以下错误:“IntegerLiteralConvertible,IntegerLiteralConvertible->$T6”与String不同,Op

我发现这有助于我达到现在的状态,但现在我陷入了困境

enum Op {
    case binary((Double, Double) -> Double)
}

var ops = [String: Op]()

func addOperation(symbol: String, op: Op) {
    ops[symbol] = op
}

addOperation("×", Op.binary(*))
addOperation("÷", Op.binary({ $1 / $0 }))
addOperation("+", Op.binary(+))
addOperation("−", Op.binary({ $1 - $0 }))

var newValue = ops["÷"](6, 3) // Produces the error

我的理解是ops[÷]应该是我先前存储在数组中的函数。我说得不对吗?

你有两个问题。首先,订阅字典会返回一个可选值,所以ops[÷]是一个Op?你需要先把它拆开才能使用

其次,枚举的关联值不能直接访问,只能在switch语句中进行模式匹配时才能获取该值。我建议在Op中添加一个计算属性,为您完成以下工作:

enum Op {
    case binary((Double, Double) -> Double)

    var binaryCall: ((Double, Double) -> Double)? {
        switch self {
        case let .binary(operation):
            return operation
        }
    }
}
那么你可以这样称呼它:

var newValue = ops["÷"]?.binaryCall?(6, 3)
// Optional(0.5)
另一种实现方法是只构建一个二进制操作字典,就像这样,您仍然需要展开一次,不过:

typealias BinaryOp = (Double, Double) -> Double

var binaryOps: [String: BinaryOp] = [:]

binaryOps["×"] = { $0 * $1 }
binaryOps["÷"] = { $1 / $0 }

newValue = binaryOps["÷"]?(6, 3)

你有两个问题。首先,订阅字典会返回一个可选值,所以ops[÷]是一个Op?你需要先把它拆开才能使用

其次,枚举的关联值不能直接访问,只能在switch语句中进行模式匹配时才能获取该值。我建议在Op中添加一个计算属性,为您完成以下工作:

enum Op {
    case binary((Double, Double) -> Double)

    var binaryCall: ((Double, Double) -> Double)? {
        switch self {
        case let .binary(operation):
            return operation
        }
    }
}
那么你可以这样称呼它:

var newValue = ops["÷"]?.binaryCall?(6, 3)
// Optional(0.5)
另一种实现方法是只构建一个二进制操作字典,就像这样,您仍然需要展开一次,不过:

typealias BinaryOp = (Double, Double) -> Double

var binaryOps: [String: BinaryOp] = [:]

binaryOps["×"] = { $0 * $1 }
binaryOps["÷"] = { $1 / $0 }

newValue = binaryOps["÷"]?(6, 3)

@Nate Cook的答案是正确的,但在这种情况下为什么必须使用enum?考虑使用以下类型:

var ops = [String: Op]()

    func addOperation(symbol: String, op:Op) {
        ops[symbol] = op
    }

    addOperation("×", (*))
    addOperation("÷", ({ $1 / $0 }))
    addOperation("+", (+))
    addOperation("−", ({ $1 - $0 }))

    var newValue = ops["÷"]?(3,6)

// you have to put this outside of any class
public typealias Op = (Double, Double) -> Double

@Nate Cook的答案是正确的,但在这种情况下为什么必须使用enum?考虑使用以下类型:

var ops = [String: Op]()

    func addOperation(symbol: String, op:Op) {
        ops[symbol] = op
    }

    addOperation("×", (*))
    addOperation("÷", ({ $1 / $0 }))
    addOperation("+", (+))
    addOperation("−", ({ $1 - $0 }))

    var newValue = ops["÷"]?(3,6)

// you have to put this outside of any class
public typealias Op = (Double, Double) -> Double

对不起,没有看到你的帖子进来!好主意使用枚举有什么好处吗?@Phil枚举为一组相关值定义了一个公共类型,并使您能够在代码中以类型安全的方式使用这些值。在你的情况下,EnUM只保留一个值,这就是为什么你应该考虑使用Type AssiRouRy,没有看到你的帖子进来!好主意使用枚举有什么好处吗?@Phil枚举为一组相关值定义了一个公共类型,并使您能够在代码中以类型安全的方式使用这些值。在你的例子中,EnUM只有一个值,这就是为什么你应该考虑使用Type来解释我的错误的原因,”Nate Cook。“我真的很感激。谢谢你对我错误的解释,”内特·库克。我真的很感激。