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