Swift: 尝试在实例函数中调用闭包时出错
Swift: Error when trying to call a closure in an instance function
我试图定义一个 class 包括一个闭包来更新它的变量。 class 定义如下:
class Layout
{
let name: String
var choHash: [String: String]
var jungHash: [String: String]
var jongHash: [String: String]
let updater: ([String: String], [String: String], [String: String] -> ())
init(name: String, choHash: [String: String], jungHash: [String: String], jongHash: [String: String], updater: ([String: String], [String: String], [String: String] -> ()))
{
self.name = name
self.choHash = choHash
self.jungHash = jungHash
self.jongHash = jongHash
self.updater = updater
}
func update() -> ()
{
self.updater(self.choHash, self.jungHash, self.jongHash) // Error here
}
}
例如,这与我在 Ruby 中所做的非常相似。但是,XCode这里显示错误:
'(@lvalue [String : String], @lvalue [String : String], @lvalue [String : String]) -> $T8' 与 '([String : String], [String : 字符串], [字符串: 字符串] -> ())'
我有两个问题:
为什么会发生这种情况,我该如何解决这个问题?特别是,为什么它将语句理解为传递@lvalue [String: String],而不是[String: String]?
问题解决后,变量choHash, jungHash, jongHash 会正常更新吗?
问题是这个类型:
([String: String], [String: String], [String: String] -> ())
不是函数类型。
这是一个三元组,包含两个字典和一个从字典到void的函数。
如果您想要一个包含 3 个字典的函数,这就是您需要的类型:
([String: String], [String: String], [String: String]) -> ()
如果您修改 let
和 init
参数中的类型,编译成功。
也就是说,当你说:
will the variables choHash, jungHash and jongHash updated properly?
答案是——可能不会。当您调用 x.update
时,您是否期望闭包更新 x
中的字典?如果是这样,它们就不会了(除非那个闭包能以某种方式获得对 x
本身的引用)。 Swift 中的字典按值传递,因此除非它们作为 inout
参数传递,否则被调用函数所做的任何事情都不会改变调用者传入的值。
我试图定义一个 class 包括一个闭包来更新它的变量。 class 定义如下:
class Layout
{
let name: String
var choHash: [String: String]
var jungHash: [String: String]
var jongHash: [String: String]
let updater: ([String: String], [String: String], [String: String] -> ())
init(name: String, choHash: [String: String], jungHash: [String: String], jongHash: [String: String], updater: ([String: String], [String: String], [String: String] -> ()))
{
self.name = name
self.choHash = choHash
self.jungHash = jungHash
self.jongHash = jongHash
self.updater = updater
}
func update() -> ()
{
self.updater(self.choHash, self.jungHash, self.jongHash) // Error here
}
}
例如,这与我在 Ruby 中所做的非常相似。但是,XCode这里显示错误:
'(@lvalue [String : String], @lvalue [String : String], @lvalue [String : String]) -> $T8' 与 '([String : String], [String : 字符串], [字符串: 字符串] -> ())'
我有两个问题:
为什么会发生这种情况,我该如何解决这个问题?特别是,为什么它将语句理解为传递@lvalue [String: String],而不是[String: String]?
问题解决后,变量choHash, jungHash, jongHash 会正常更新吗?
问题是这个类型:
([String: String], [String: String], [String: String] -> ())
不是函数类型。
这是一个三元组,包含两个字典和一个从字典到void的函数。
如果您想要一个包含 3 个字典的函数,这就是您需要的类型:
([String: String], [String: String], [String: String]) -> ()
如果您修改 let
和 init
参数中的类型,编译成功。
也就是说,当你说:
will the variables choHash, jungHash and jongHash updated properly?
答案是——可能不会。当您调用 x.update
时,您是否期望闭包更新 x
中的字典?如果是这样,它们就不会了(除非那个闭包能以某种方式获得对 x
本身的引用)。 Swift 中的字典按值传递,因此除非它们作为 inout
参数传递,否则被调用函数所做的任何事情都不会改变调用者传入的值。