带闭包初始值设定项的存储属性不允许局部变量

时间:2016-05-01 18:41:02

标签: swift closures xcode7 swift2.2

以下代码有效:

class Test {
    let api = "abc"
    let apiParam = {
       return ["api": api]
    }()
}

但是当常量api被移入apiParam属性时,我得到错误:“无法调用类型{}的封闭 - >> _带有参数列表()”

class Test {
    let apiParam = {
      let api = "abc"
      return ["api": api]
    }()
 }

但是,将常量替换为实际值将消除错误。

class Test {
    let apiParam = {
      return ["api": "abc"]
    }()
 }

1 个答案:

答案 0 :(得分:1)

这只是斯威夫特以神秘的方式告诉你,你没有提供足够的类型信息。通常它能够非常有效地推断类型,但是有时候会挣扎,通常是在闭包之间。如果您明确定义apiParam的类型,则错误将被取消。

class Test {
    let apiParam:[String:String] = {
        let api = "abc"
        return ["api": api]
    }()
}

虽然请注意您的第一个示例未编译 - 但您会收到instance member 'api' cannot be used on type 'Test'错误。这是因为self将引用该范围内的静态类,而不是实例 - 意味着您无法访问api属性。

你需要让apiParam成为一个懒惰的属性(这样当你第一次访问时就会创建它,意味着self将引用该实例),或者将api设为静态,因此它可以在班级获得。