为啥 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
    

【问题讨论】:

selfcolour 上隐式使用,如果参数名称与属性相同,则只需键入它,例如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
    

注意colourCar 的属性,同时也是convenience init 的参数名称。写colour = colour会很混乱。

所以我们使用self 表示我们希望类中的变量self.colour 等于参数的值colour

【讨论】:

所以如果你可以在颜色上使用 self 但你可以把它忽略掉,你能不能在调用 self.init() 时把它忽略掉 @AndrewBreeze-Stringfellow 如果你有一个参数和一个同名的属性,你必须使用 self ,就像在我的例子中一样,因为不清楚你指的是什么 colour .初始化器与函数并不完全一样,因此您不能只调用 init() 它是自己的,当您引用初始化器时,您总是必须使用 selfsuper【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 返回整数而不是字符串 [关闭]

为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用

为啥将@Transactional 与@Service 一起使用而不是与@Controller 一起使用

为啥在 python 中使用类方法而不是实例方法

为啥将 xor 与文字而不是反转一起使用(按位不)

可以将“self”与 NSSortDescriptor 一起使用来按对象本身而不是对象的属性进行排序? (核心数据/NSFetchedResultsController)