您无法初始化变量

时间:2017-05-26 14:29:01

标签: swift

错误"无法使用实例成员' 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

中传递值

2 个答案:

答案 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:)