Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 财产';self.';在super.init调用时未初始化_Ios_Swift_Xcode6.3.1 - Fatal编程技术网

Ios 财产';self.';在super.init调用时未初始化

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

我刚刚将我的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
关于这个代码

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
    }