为什么需要在Swift中为UIViewController子类添加空构造函数

时间:2015-03-03 14:57:20

标签: swift uiviewcontroller

为什么我需要添加这些构造函数(空),即使我不在UIViewController子类中添加一些自定义初始化内容?

    override init() {
        super.init()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

2 个答案:

答案 0 :(得分:4)

在Swift中,与某些语言不同,子类通常不会继承其超类的初始化器。自动初始化程序继承只能在某些条件下进行。鉴于课程A

class A {
    var a: Int
    var r: Int

    init(a: Int) {
        self.r = 0
        self.a = a
    }
}

只有满足以下两个条件时,类B才会自动继承初始值设定项:

一个。所有新引入的子类属性都已分配了默认值。

湾没有新的指定初始化器引入子类,或者任何新引入的初始化器提供它们自己的超类初始化器的实现:

//All values assigned, no additional initializers
class C: A {
    var c: Int = 9
}

//Provides an implementation of class A's initializer
class B: A {
    init() {
        super(a: 0)
    }
}

现在,如果我们将一个必需的初始化程序引入一个类,那么事情会变得很糟糕。

class AWithRequired {
    var a: Int
    var r: Int

    init(a: Int) {
        self.r = 0
        self.a = a
    }

    required init(a: Int, r: Int) {
        self.r = r
        self.a = a
    }

}

在这种情况下,我们不能引入任何非指定的初始化程序,也不会覆盖所需的初始化程序:

//Still OK--no new initializers introduced
class BWithRequired: AWithRequired {
    var b: Int = 9
}

//Doesn't ovverride required initializer, throws an error
class CWithRequired: AWithRequired {
    init() {
        super.init(a: 0, r: 0)
    }
}   //ERROR: Required Initializer must be supplied by subclass of 'AWithRequired'

//OK, overrides required initializer
class DWithRequired: AWithRequired {
    required init(a: Int, r: Int) {
        super.init(a: 0, r: 0)
    }
}

//OK, provides non-designated initializer
class EWithRequired: AWithRequired {
    convenience init() {
        self.init(a: 0, r: 0)
    }
}

从示例中可以看出,绕过限制并仍然实现自定义初始化程序的唯一方法是引入非指定的,例如, convenience初始化程序。

答案 1 :(得分:0)

为避免这种情况,在类中初始化新变量时,需要分配它们。

示例:

class yourTestClass
{
     var testString:String = ""
     //or
     var testStringTwo:String = String()
}