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

时间:2015-03-17 14:25:42

标签: 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] -> ())

    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],@ value [String:String],@ value [String:String]) - > $ T8'与'([String:String],[String:String],[String:String] - >())'不相同

我有两个问题:

  1. 为什么会发生这种情况,我该如何解决这个问题呢?特别是,为什么它将语句理解为传递@lvalue [String:String]而不是[String:String]?

  2. 一旦问题解决了,变量choHash,jungHash和jongHash会更新吗?

1 个答案:

答案 0 :(得分:0)

问题是这种类型:

([String: String], [String: String], [String: String] -> ())

不是函数类型。

这是一个3元组,包含两个字典和一个从字典到无效的函数。

如果你想要一个带3个字典的函数,这就是你需要的类型:

([String: String], [String: String], [String: String]) -> ()

如果修改letinit参数中的类型,则编译正常。

那就是说,当你说:

  

变量choHash,jungHash和jongHash会更新吗?

答案是 - 可能不是。当您致电x.update时,您期望通过关闭来更新x中的词典吗?如果是这样,它们将不会(除非该闭包以某种方式可以获得对x本身的引用)。 Swift中的字典是按值传递的,因此除非它们作为inout参数传递,否则被调用的函数都不会改变调用者传入的值。