Moh*_*din 17 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:20: Immutable value 'self.originView' may only be initialized once
Run Code Online (Sandbox Code Playgroud)
在这个代码上
let originView:UIView?
override init() {
super.init() //error here
}
init(sourceView:UIView, menuItems:Array<String>){
super.init() //error here
originView = sourceView //error here
Run Code Online (Sandbox Code Playgroud)
请指教.谢谢.
小智 22
在调用super.init任何init方法之前,必须初始化所有属性
所以,在调用super.init()之前改变它
originView = sourceView //error here
Run Code Online (Sandbox Code Playgroud)
例外:
Nit*_*rge 14
让你的originView可空
var originView: UIView?.
Run Code Online (Sandbox Code Playgroud)
如果您originView不可为空,则必须在致电前提供默认值
super.init().
Run Code Online (Sandbox Code Playgroud)
来自 Apple 的“The Swift Programming Language”一书:
“Swift 的编译器执行四项有助于safety-checks确保两阶段初始化无错误完成”
“指定的初始化程序必须确保所有“由其类引入的属性在它委托给超类初始化程序之前都已初始化”。
基本上你必须ensure that your instance variables are in a consistent state在你做任何事情之前,包括调用方法。
class YourClass {
var view: UIView
init(view: UIView) {
self.view = view
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,在您的情况下,您可以将其设为新的 UIView:
let originView = UIView()
Run Code Online (Sandbox Code Playgroud)
或者让它可以为空
let originView: UIView?
Run Code Online (Sandbox Code Playgroud)
或者创建一个惰性属性:
lazy var originView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 200))
// customize it
return view
}()
Run Code Online (Sandbox Code Playgroud)
使用延迟实例化时,您可以传递一个方法:
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
}
Run Code Online (Sandbox Code Playgroud)