Swift:尝试在实例函数中调用闭包时出错

Swift:尝试在实例函数中调用闭包时出错,swift,closures,Swift,Closures,我试图定义一个包含闭包的类来更新它的变量。类定义如下所示: 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] -> ()

我试图定义一个包含闭包的类来更新它的变量。类定义如下所示:

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: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
    参数中修改了类型,它将编译为OK

    也就是说,当你说:

    变量choHash、jungHash和jongHash是否正确更新


    答案是——可能不是。当您调用
    x.update
    时,您是否希望
    x
    中的词典通过闭包更新?如果是这样的话,它们就不会是(除非这个闭包能够以某种方式获得对
    x
    本身的引用)。Swift中的字典是按值传递的,因此除非它们作为
    inout
    参数传递,否则被调用函数所能做的任何事情都不会改变调用者传入的值。

    哦,多么愚蠢的错误啊。添加“inout”后,现在该代码可以完美地运行。非常感谢。