更新到 Swift 1.2 后出错
Error after update to Swift 1.2
我很快更新到 Swift 1.2,它附带 Xcode 6.3.2 并写了几行代码:
let originView:UIView!
override init() {
super.init()
}
init(sourceView:UIView, menuItems:Array<String>){
super.init()
originView = sourceView
}
这段代码运行完美,直到我更新了 Xcode (6.3.2) 的新版本。
现在我得到以下错误:Property 'self.originView' not initialized at super.init call
直到现在我都找不到解决办法,因为我还在学习Swift。
有人知道我怎么解决这个问题吗?
P.S 它不是 的副本,因为这段代码:init(sourceView:UIView, menuItems:Array<String>)
而不是 override init(frame: CGRect)
。
更新:
新代码:
override convenience init() {
self.init()
}
init(sourceView:UIView, menuItems:Array<String>){
originView = sourceView
super.init()
}
新错误: Thread 1: EXC_BAD_ACCESS (code=2, address=0x7fff5f300ff8)
在这行代码中:self.init()
交换 init(sourceView: UIView, menuItems:Array<String>)
中的 2 行:
init(sourceView:UIView, menuItems:Array<String>){
originView = sourceView
super.init()
}
希望这会奏效。
编辑:在您的第一个函数中调用 super.init()
您必须在调用超类初始化程序之前初始化所有非可选可变属性和所有不可变属性(无论是否可选):
init(sourceView:UIView, menuItems:Array<String>){
originView = sourceView
super.init(frame: CGRect.zeroRect)
}
请注意,由于 originView
属性 是不可变的,因此您真的不需要将其设为隐式解包可选。传递给初始化程序的 sourceView
参数不是可选的,因此您可以使 属性 成为非可选参数:
let originView: UIView
尝试修改这部分。
override init() {
super.init()
}
到
override init() {
self.init(UIView(), nil) // Or other initial values
}
如果这不能解决您的错误,这是更好的方法,因为 init() 调用您的自定义 init 并初始化您的变量。
更新时编辑
您的修改不正确
override convenience init() {
self.init() // This init referred "override convenience init()" !! So recursive call
}
你必须像我之前说的那样提供 init 调用的参数,以便将 "override convenience init()" 重定向到 "init(sourceView:UIView, menuItems:Array)"。
更改此行:
let originView:UIView!
至
var originView:UIView!
大功告成。
我很快更新到 Swift 1.2,它附带 Xcode 6.3.2 并写了几行代码:
let originView:UIView!
override init() {
super.init()
}
init(sourceView:UIView, menuItems:Array<String>){
super.init()
originView = sourceView
}
这段代码运行完美,直到我更新了 Xcode (6.3.2) 的新版本。
现在我得到以下错误:Property 'self.originView' not initialized at super.init call
直到现在我都找不到解决办法,因为我还在学习Swift。
有人知道我怎么解决这个问题吗?
P.S 它不是 init(sourceView:UIView, menuItems:Array<String>)
而不是 override init(frame: CGRect)
。
更新:
新代码:
override convenience init() {
self.init()
}
init(sourceView:UIView, menuItems:Array<String>){
originView = sourceView
super.init()
}
新错误: Thread 1: EXC_BAD_ACCESS (code=2, address=0x7fff5f300ff8)
在这行代码中:self.init()
交换 init(sourceView: UIView, menuItems:Array<String>)
中的 2 行:
init(sourceView:UIView, menuItems:Array<String>){
originView = sourceView
super.init()
}
希望这会奏效。
编辑:在您的第一个函数中调用 super.init()
您必须在调用超类初始化程序之前初始化所有非可选可变属性和所有不可变属性(无论是否可选):
init(sourceView:UIView, menuItems:Array<String>){
originView = sourceView
super.init(frame: CGRect.zeroRect)
}
请注意,由于 originView
属性 是不可变的,因此您真的不需要将其设为隐式解包可选。传递给初始化程序的 sourceView
参数不是可选的,因此您可以使 属性 成为非可选参数:
let originView: UIView
尝试修改这部分。
override init() {
super.init()
}
到
override init() {
self.init(UIView(), nil) // Or other initial values
}
如果这不能解决您的错误,这是更好的方法,因为 init() 调用您的自定义 init 并初始化您的变量。
更新时编辑
您的修改不正确
override convenience init() {
self.init() // This init referred "override convenience init()" !! So recursive call
}
你必须像我之前说的那样提供 init 调用的参数,以便将 "override convenience init()" 重定向到 "init(sourceView:UIView, menuItems:Array)"。
更改此行:
let originView:UIView!
至
var originView:UIView!
大功告成。