第十四章 构造过程

c++构造器可看成与类同名、无返回值的成员函数,而swift构造器用专用的关键字init来标示,语法如下:

init(){

}

与c++一样,swfit构造器也是没有返回值。

struct Celsius {

    var temperatureInCelsius: Double

    init(fromFahrenheit fahrenheit: Double) {

        temperatureInCelsius = (fahrenheit - 32.0) / 1.8

    }

    init(fromKelvin kelvin: Double) {

        temperatureInCelsius = kelvin - 273.15

    }

}

默认构造器

类和结构体定义存储属性时有了初始值后,swift提供默认构造器,此外结构体还提供了逐一成员构造器。

struct Size {

    var width = 0.0

    var height = 0.0

}

let zeroByZero = Size()

let twoByTwo = Size(width: 2.0, height: 2.0)

C++的结构体没有逐一成员构造器。此外,c++也提供了默认构造器,与swift不同,c++对于内置类型(整型、字符型、布尔型、浮点型)不需指定初始值,默认构造器设置为0;对于提供了默认构造器的类型,默认构造器使用该类型的默认构造器初始化该成员变量。

Swift 和c++一样,当显式定义了一个构造器,swift将不提供默认构造器。

指定构造器和便利构造器

与c++不同,swift提供了便利构造器,与便利构造器相对应的称为指定构造器。

convenience init(parameters) {

    statements

}

在普通构造器前面加convenience标示便利构造器。

指定构造器和便利构造器的规则:

规则1

指定构造器必须调用其直接父类指定构造器;

规则2

便利构造器必须调用同类的其他构造器;

规则3

便利构造器必须最终导致一个指定构造器被调用。

构造过程

swift和c++的构造过程不同,由于c++是对内存进行操作的,因此其构造过程是先执行基类构造器,后执行子类构造器。

c++构造过程:父类成员初始化列表,父类构造方法内赋值,子类成员初始化列表,子类构造方法内赋值。

swift构造过程包含两个阶段。第一阶段,每个存储属性被引入它们的类指定一个初始值;当每个存储属性的初始值被确定后,第二阶段开始,它给类一次机会,进一步定制它们的存储属性。

swift构造有一个构造链,第一阶段是从下往上,先调用子类的指定构造器,确保子类的所有属性都有值,然后调用父类的指定构造器,并沿着构造链一直往上完成父类的构造过程。

第二阶段,是从上往下,父类的指定的构造器完成调用,子类的指定构造器可以执行更多的定制操作。子类的指定构造器完成调用,便利构造器(如果有的话)可以执行更多的定制操作。

构造器继承与重写

c++构造器不能继承,可以重写;swift构造器可以重写,override是重写关键字。

此外,swift子类满足特定条件,可以自动继承父类构造器。

条件:子类新引入的所有属性都有默认值。符合如下规则:

规则1、如果子类没有定义任何指定构造器,它将自动继承父类的所有指定构造器;

规则2、如果子类提供了所有父类指定构造器的实现(无论是通过规则1获取,或者自定义实现),它将自动继承所有父类的便利构造器。

class Food {

    var name: String

    init(name: String) {

        self.name = name

    }

    convenience init() {

        self.init(name: "[Unnamed]")

    }

}

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)

    }

}

let oneMysteryItem = RecipeIngredient()

print(oneMysteryItem.name)

print(oneMysteryItem.quantity)

let oneBacon = RecipeIngredient(name: "Bacon")

let sixEggs = RecipeIngredient(name: "Egg", quantity: 6)

class ShoppingListItem: RecipeIngredient {

var purchased = false

var description: String {

var output = "\(quantity) x \(name)"

output += purchased ? " ✔" : " ✘"

return output

}

}

var breakfastList = [

ShoppingListItem(),

ShoppingListItem(name: "Bacon"),

ShoppingListItem(name: "Eggs", quantity: 6),

]

breakfastList[0].name = "Juice"

breakfastList[0].purchased = true

for item in breakfastList {

print(item.description)

}

可失败构造器

在编程实践中,我们会遇到构造失败的情况,c++面对这个情况,如临大敌,需要小心翼翼处理的。swift提供了一个简单的方式—可失败构造器。

在init关键字后面添加问好(?)。

struct Animal {

    let species: String

    init?(species: String) {

        if species.isEmpty { return nil }

        self.species = species

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容

  • 本章将会介绍 存储属性的初始赋值自定义构造过程默认构造器值类型的构造器代理类的继承和构造过程可失败构造器必要构造器...
    寒桥阅读 765评论 0 0
  • 构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例可用前必须执行这个过程,具体操作包括设置实例中每个...
    莽原奔马668阅读 675评论 0 3
  • 问题概述 在分布式系统中,宕机是需要考虑的重要组成部分。日志技术是宕机恢复的重要技术之一。日志技术应用广泛,早些更...
    fengjixcuhui阅读 284评论 0 0
  • 记得在多年前的一部电视剧《北京人在纽约》里有这样一句话,你爱他吗,把他送到纽约,因为那里是天堂;你恨他吗?把他送到...
    我是东北仁儿阅读 821评论 23 28
  • 她发现我偷看她帖子了,怎么办😳现在心好慌…她会不会生气,会不会生气😭我是不是不该偷看的…但是仍控制不住自己的手,想...
    言必然后的背后阅读 257评论 0 1