为什么将自己与init一起使用,而不与color一起使用

时间:2019-03-25 03:33:08

标签: swift self

我正在快速上在线课程,并显示了一个示例。为什么将self与init方法调用一起使用,而不在颜色上使用?

class Car {

    var colour = "Black"
    var numberOfSeats = 5
    var typeOfCar : CarType = .Coupe

    init() {

    }

    convenience init (customerChosenColour : String) {
        self.init()
        colour = customerChosenColour
    }
}

2 个答案:

答案 0 :(得分:1)

当某人创建该类的新实例时,就会运行init()

var newInstanceOfCar = Car()

convenience init允许您为某些用例创建其他初始化程序,例如需要指定customerChosenColour时。在这种情况下,事情变得更加方便。

之所以使用self是因为创建convenience init时,您仍然需要调用“主” init,这是self的属性


您可以在颜色上使用self,但这不是必需的。如果self.colour不明确,则可以使用colour,例如以下示例:

class Car {

    var colour = "Black"
    var numberOfSeats = 5
    var typeOfCar : CarType = .Coupe

    init() {

    }

    convenience init (colour : String) {
        self.init()
        self.colour = colour
    }
}

请注意colourCar的属性,但还是convenience init的参数名称。写colour = colour会令人困惑。

因此,我们使用self来表示我们希望类self.colour中的变量等于参数colour的值。

答案 1 :(得分:0)

当您想知道为什么self.不能在self.init()中省略时,您可以将self.init()视为一个特殊的关键字,只是为了方便初始化。整体上与super.init()相同,这是一个特殊关键字,仅用于指定的初始化程序。 Car.init()又称Car()用于创建新实例。在没有任何接收者的情况下自行呼叫init()从来都不是有效的呼叫。因此,您可以将函数调用init()视为不存在,self.init()是一个关键字,super.init()是另一个关键字。

init()不是成员函数,它是初始化器,一些特殊的代码将在创建该类的新实例时运行。不要将初始化程序视为常规成员函数。他们前面没有func关键字。它们不具有成员函数的属性。您可以在实例上调用成员函数,但不能在实例上调用初始化程序(Car().init()无效)。 self.init()并不意味着从init()调用名为self的函数。

class Foo
{
    init(){}

    func foo(){}

    func bar()
    {
        self.foo()  //valid. regular member function call
        self.init() //invalid. init() is not a member function of the instance
    }
}

不要认为self.init()就像从同一类中调用常规方法一样,其中self.可以省略,而是将整个内容视为一个特殊的关键字,这意味着“用指定的对象初始化此对象初始化器优先”。