Ios 财产';self.';在super.init调用时未初始化
我刚刚将我的xcode更新为6.3.1。问题是我从Swift 1.2开始就收到了这个奇怪的错误消息。我收到了这样的错误信息Ios 财产';self.';在super.init调用时未初始化,ios,swift,xcode6.3.1,Ios,Swift,Xcode6.3.1,我刚刚将我的xcode更新为6.3.1。问题是我从Swift 1.2开始就收到了这个奇怪的错误消息。我收到了这样的错误信息 /Users/MNurdin/Documents/iOS/xxxxx/Library/SideBar.swift:32:15: Property 'self.originView' not initialized at super.init call /Users/MNurdin/Documents/iOS/xxxxx/Library/SideBar.swift:38:2
/Users/MNurdin/Documents/iOS/xxxxx/Library/SideBar.swift:32:15: Property 'self.originView' not initialized at super.init call
/Users/MNurdin/Documents/iOS/xxxxx/Library/SideBar.swift:38:20: Immutable value 'self.originView' may only be initialized once
关于这个代码
let originView:UIView?
override init() {
super.init() //error here
}
init(sourceView:UIView, menuItems:Array<String>){
super.init() //error here
originView = sourceView //error here
let originView:UIView?
重写init(){
super.init()//此处出错
}
初始化(sourceView:UIView,menuItems:Array){
super.init()//此处出错
originView=sourceView//此处出错
在任何init方法中调用super.init
之前,必须初始化所有属性
因此,在调用super.init()之前,请更改此选项
例外情况:
使您的
originView
var originView: UIView?.
如果您的originView
不可为空,则必须在调用之前提供默认值
super.init().
摘自苹果的《Swift编程语言》一书: “Swift的编译器执行四次有用的
安全检查
,以确保两阶段初始化无误完成”
指定的初始值设定项必须确保其类引入的所有“属性”在委托给超类初始值设定项之前都已初始化
基本上,在执行任何操作(包括调用方法)之前,必须确保实例变量处于一致状态
class YourClass {
var view: UIView
init(view: UIView) {
self.view = view
}
}
在您的情况下,您可以将其设置为新的UIView:
let originView = UIView()
或者将其设置为可为空
let originView: UIView?
或者创建一个惰性属性:
lazy var originView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 200))
// customize it
return view
}()
使用惰性实例化时,可以传递一个方法:
lazy var originView: UIView = self.createView()
func createView() -> UIView {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 200))
// customize it
return view
}
这可能是您的问题:我已经初始化了属性。请检查我的问题。仍然存在错误。此答案似乎与问题中的代码不太匹配。本例中的问题不是赋值的位置,问题是您不能使用let
声明可选属性。let originView:UIView!。您声明了origi使用“let”将nView视为常量。当使用“let”时,它应为“var”除了在声明过程中,您不允许再次更改它的值。您是正确的,对不起,我犯了错误。让我先试试。更好的做法是什么?使用nullable或lazy属性?@Edgar这取决于实际情况。没有最好的方法,您需要考虑您的类应该如何运行,应该具有什么状态,以及根据您编写代码的信息.试着先在纸上描述你的课程,然后编写代码,很快你就会自动完成你脑子里的所有事情。
lazy var originView: UIView = self.createView()
func createView() -> UIView {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 200))
// customize it
return view
}