2017-05-26 195 views
-1

错误“无法属性初始化中使用实例成员‘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

即使你在文件末尾写了这两行,编译器看到后马上看着他们:

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(),例如,他们会没事的。

0

你的最后两行是你的类/结构的两个附加属性。编译器无关紧要地将它们列在初始化程序之下,它们将始终在任何初始化程序运行之前运行。但是,由于属性初始化程序访问要初始化但不是的实例的属性,Swift编译器会抱怨:在可以使用实例成员(所述属性)之前,实例必须完全初始化。

可能的溶液#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:)