以下代码有效:
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"]
}()
}
答案 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
设为静态,因此它可以在班级获得。