swift学习-指定和便利构造-12/29

今天只有中午看了一会。看到150多页了,基本理解了swift的构造过程。
下午给xcode装了个vim的插件,xvim,似乎还挺不错的。

便利构造器。便利构造器语法:
convenience init() {….
指定构造器和便利构造器实战:
子类不会默认继承父类的构造器。但是如果条件可以满足,父类构造器可以被自动继承。
如果子类提供了所有父类指定构造器的实现,不管是继承来的还是通过自定义实现的,它将自动继承所有父类的便利构造器。
注意:子类可以通过部分满足的方式,使用子类的便利构造器来实现父类的指定构造器。

class Food {
    var name: String

    init(name: String) {
        self.name = name
    }

    convenience init() {
        self.init(name: "[Unnamed]")
    }
}

let nameMead = Food(name: "Bacon")

class RecipeIngredient: Food {
    var quantity: Int

    init(name: String, quantity: Int) {
        self.quantity = quantity
        super.init(name: name)
    }

    override convenience init(name: String) {
        self.init(name: name, quantity: 1)
    }
}

var myFood = RecipeIngredient() //默认构造器被继承,因为子类已实现父类的全部指定构造器,默认构造器调用init(name: String) -> super.init()

print(myFood.quantity)
print(myFood.name)

class ShoppingListItem: RecipeIngredient {
    var purchased = false
    var description: String {
        return "\(quantity) * \(name.lowercaseString)"
    }
}

let shoppItem = ShoppingListItem()

print(shoppItem.description)

由于第三个类为它自己引入的所有属性都提供了默认值,并且没有定义构造器,它将自动继承所有父类中的指定构造器和便利构造器。
ShoppingListItem.init() -> (继承) RecipeIngredient.init() -> (继承) Food.init()(convenience)

Foo.init() -> (调用) self.init(name: String) 由于init(name: String)在RecipeIngredient中被重写,因此调用 RecipeIngredient.init(name: String) -> RecipeIngredient.init(name: String, quantity: Int) -> Foo.init(name: String)。

晚上看了一晚上的锤子手机发布,木有看书。
发布会木有啥子惊喜,乏善可陈。
还是祝福一下老罗吧。有梦想而且偏执的人,实在太少了。

你可能感兴趣的:(swift学习-指定和便利构造-12/29)