我正在快速上在线课程,并显示了一个示例。为什么将self与init方法调用一起使用,而不在颜色上使用?
class Car {
var colour = "Black"
var numberOfSeats = 5
var typeOfCar : CarType = .Coupe
init() {
}
convenience init (customerChosenColour : String) {
self.init()
colour = customerChosenColour
}
}
答案 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
}
}
请注意colour
是Car
的属性,但还是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.
可以省略,而是将整个内容视为一个特殊的关键字,这意味着“用指定的对象初始化此对象初始化器优先”。