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

标签 swift closures xcode7 swift2

以下代码有效:

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"]
    }()
 }

最佳答案

这只是 Swift 以一种神秘的方式告诉你你没有向它提供足够的类型信息。通常它能够非常有效地推断类型,但有时会很困难,通常是在闭包周围。如果您显式定义 apiParam 的类型,错误将被消除。

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

尽管请注意,您的第一个示例无法编译 - 您将收到实例成员“api”无法在类型“Test”上使用错误。这是因为 self 将引用该范围内的静态类,而不是实例 - 这意味着您无法访问 api 属性。

您需要将 apiParam 设置为惰性属性(以便在您第一次访问时创建它,这意味着 self 将引用到实例),或者使 api 静态,以便它在类级别可用。

关于swift - 带有闭包初始值设定项的存储属性不允许局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36970492/

相关文章:

ios - 我可以在一台Mac计算机上安装Xcode 7 beta和Xcode 6吗

swift - 触发一个事件并等待多个事件 RxTest

javascript - 我可以在 TypeScript 中扩展函数吗?

swift - 关于 swift 3 中的速记参数。Swift 的新功能

xcode - 重构 ViewControllers - 错误 : Storyboard both contain a view controller with same identifier

swift2 - 迁移期间无法将 'RealmSwift.DynamicObject' 类型的值转换为 MyCustomObject

swift - Xcode 调整使用 paintcode 生成的矢量形状

ios - Google Cloud Storage iOS - 无身份验证

swift - 在 iOS13.1 上播放音频时应用程序崩溃

返回未定义的 Javascript 闭包