错误"无法使用实例成员' anatherKeyPlistTableData'在属性初始化器内;属性初始化程序在“自我”之前运行可用"在最后两行
var anatherHeaderNameImage: String
var anatherKeyPlistTableData: String
let keyPlistTableDataDefult = "Agregate"
let headerNameImageDefult = "agregate_header"
init(anatherKeyPlistTableData: String?, anatherHeaderNameImage: String?) {
self.anatherHeaderNameImage = anatherHeaderNameImage!
self.anatherKeyPlistTableData = anatherKeyPlistTableData!
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
let keyPlistTableData = anatherKeyPlistTableData! ?? keyPlistTableDataDefult
let headerNameImage = anatherHeaderNameImage! ?? headerNameImageDefult
我希望能够在变量anatherHeaderNameImage和anatherKeyPlistTableData
中传递值答案 0 :(得分:0)
即使您在文件底部写了这两行,编译器也会在看到它们后立即查看它们:
var anatherHeaderNameImage: String
var anatherKeyPlistTableData: String
let keyPlistTableDataDefult = "Agregate"
let headerNameImageDefult = "agregate_header"
因为它们是顶级(例如,不在方法内)。此时,编译器甚至没有查看init()。
所以你所写的并不是你想的(如果它是合法的)。看着:
let keyPlistTableData = anatherKeyPlistTableData! ?? keyPlistTableDataDefult
let headerNameImage = anatherHeaderNameImage! ?? headerNameImageDefult
此时“anatherKeyPlistTableData”和“anatherHeaderNameImage”均为零。 (没有代码执行)。
例如,如果他们在viewDidLoad()中,他们会没事的。
答案 1 :(得分:0)
您的最后两行是您的类/结构的两个附加属性。对于在初始化器下面列出它们的编译器并不重要,它们将始终在任何初始化程序运行之前运行。但是,由于属性初始值设定项访问要初始化但尚未实例化的实例的属性,因此Swift编译器会抱怨:在您可以使用实例成员(所述属性)之前,必须完全初始化该实例。 / p>
可能的解决方案#1:使它们成为计算属性:
class FooComputedProperties
{
var anatherHeaderNameImage: String?
var anatherKeyPlistTableData: String?
let keyPlistTableDataDefult = "Agregate"
let headerNameImageDefult = "agregate_header"
var keyPlistTableData: String { return anatherKeyPlistTableData ?? keyPlistTableDataDefult }
var headerNameImage: String { return anatherHeaderNameImage ?? headerNameImageDefult }
init(anatherKeyPlistTableData: String?, anatherHeaderNameImage: String?) {
self.anatherHeaderNameImage = anatherHeaderNameImage
self.anatherKeyPlistTableData = anatherKeyPlistTableData
}
}
可能的解决方案#2:设置默认值static
(这样您就可以在init
中使用它们)并初始化属性:
class Foo
{
var anatherHeaderNameImage: String?
var anatherKeyPlistTableData: String?
static let keyPlistTableDataDefult = "Agregate"
static let headerNameImageDefult = "agregate_header"
let keyPlistTableData: String
let headerNameImage: String
init(anatherKeyPlistTableData: String?, anatherHeaderNameImage: String?) {
self.anatherHeaderNameImage = anatherHeaderNameImage
self.anatherKeyPlistTableData = anatherKeyPlistTableData
self.keyPlistTableData = anatherKeyPlistTableData ?? Foo.keyPlistTableDataDefult
self.headerNameImage = anatherHeaderNameImage ?? Foo.headerNameImageDefult
}
}
请注意,我自由地更改了您的类型并删除了强制解包,以便nil合并运算符有意义。
另外,为简洁起见,我遗漏了init?(coder:)
。