为啥 self 与 init 一起使用而不是 color
Posted
技术标签:
【中文标题】为啥 self 与 init 一起使用而不是 color【英文标题】:Why is self used with init but not colour为什么 self 与 init 一起使用而不是 color 【发布时间】:2019-03-25 03:33:08 【问题描述】:我正在参加关于 swift 的在线课程,并展示了一个示例。为什么 self 与 init 方法调用一起使用而不是颜色?
class Car
var colour = "Black"
var numberOfSeats = 5
var typeOfCar : CarType = .Coupe
init()
convenience init (customerChosenColour : String)
self.init()
colour = customerChosenColour
【问题讨论】:
self
在colour
上隐式使用,如果参数名称与属性相同,则只需键入它,例如self.colour = colour
【参考方案1】:
init()
在有人像这样创建该类的新实例时运行:
var newInstanceOfCar = Car()
convenience init
允许您为某些用例创建其他初始化程序,例如需要指定 customerChosenColour
时。在这些情况下,它使事情变得更加方便。
之所以使用self
,是因为在创建convenience init
时,仍然需要调用“main”init
,这是self
的一个属性。
您可以在颜色上使用self
,但这不是必需的。如果colour
不明确,您将使用self.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
。
【讨论】:
所以如果你可以在颜色上使用 self 但你可以把它忽略掉,你能不能在调用 self.init() 时把它忽略掉 @AndrewBreeze-Stringfellow 如果你有一个参数和一个同名的属性,你必须使用 self ,就像在我的例子中一样,因为不清楚你指的是什么colour
.初始化器与函数并不完全一样,因此您不能只调用 init()
它是自己的,当您引用初始化器时,您总是必须使用 self
或 super
。【参考方案2】:
当你想知道为什么self.init()
中不能省略self.
时,你可以认为self.init()
是一个特殊的关键字,只是为了方便初始化。与super.init()
相同,因为整体是一个特殊关键字,仅用于指定的初始化程序。 Car.init()
aka Car()
用于创建新实例。在没有任何接收者的情况下调用init()
本身就不是一个有效的调用。因此,您可以将函数调用 init()
视为不存在,self.init()
是一个关键字,super.init()
是另一个关键字。
init()
不是成员函数,它是初始化程序,是一些特殊代码,在创建该类的新实例时将运行。不要将初始化程序视为常规成员函数。他们前面没有func
关键字。它们不具有成员函数的属性。您可以在实例上调用成员函数,但不能在实例上调用初始化程序(Car().init()
无效)。 self.init()
并不意味着从 self
调用名为 init()
的函数。
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.
可以省略,而是将整个事情视为一个特殊的关键字,意思是“首先使用指定的初始化程序初始化这个对象”。
【讨论】:
以上是关于为啥 self 与 init 一起使用而不是 color的主要内容,如果未能解决你的问题,请参考以下文章
为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用
为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用
可以将“self”与 NSSortDescriptor 一起使用来按对象本身而不是对象的属性进行排序? (核心数据/NSFetchedResultsController)