Swift3.1 Initialization

关于初始化的具体内容请查看官方文档
下面标出几个关键点:

  1. Swift中的初始化方法统称为初始化器

  2. 和OC不同,Swift中的类、枚举、结构体都可以有构造器,并且Swift中的构造器没有返回值,例如

    // 没有返回值,也没有func关键字
    init() {
        // perform some initialization here
    }
    
  3. Swift还为类提供了便利构造器,枚举和结构体没有

    convenice init(parameters) {
        statements
    }
    
  4. 类和结构体必须在初始化完成之前设置所有存储属性的默认值,可以在初始化时直接设置或者在初始化器中设置。如果有的存储属性从逻辑来说可以是空值,那么可以通过声明为可选值来避免初始化为确定的值,比如:

    class SurveyQuestion {
        var text: String
        var response: String?
        init(text: String) {
            self.text = text
        }
        func ask() {
            print(text)
        }
    }
    let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
    cheeseQuestion.ask()
    // Prints "Do you like cheese?"
    cheeseQuestion.response = "Yes, I do like cheese.
  1. 如果一个类或结构体没有自定义的构造器并且他的所有属性都有默认值,那么,Swift会为它们提供默认的构造器。

    对于类来说,这些类必须是基类。不然,如果子类和父类都没有任何自定义的构造器,也没办法区分子类是继承了父类的默认初始化构造器还是Swift提供的默认构造器,因为这两种情况看起来是一样的。

  2. 初始化构造器和其他函数一样默认以参数类型作为标签,如果在调用的时候不想使用参数标签可以只用_来显示的忽略标签。
  3. 如果结构体没有任何的自定义构造器,那么Swift会为它提供一个默认的成员构造器。如果结构体所有的存储属性都有默认值,那么在初始化这个结构体的时候可以调用无参构造器(会有警告但不会报错);如果其中一个存储属性没有默认值,那么必须调用成员构造器,否则会报错。

    成员构造器:结构体中,以结构体成员作为参数的构造器

  4. 如果提供了自定义的构造器,那么默认构造器将不复存在

    包括结构体的成员构造器,所以,如果为结构体提供自定义构造器,请确保结构体中的所有存储属性在初始化完成之前都有值了,否则会报错

  5. 针对第7点,可以使用Extension来增加自定义构造器,避免默认构造器无法使用
  6. 类、结构体必须至少有一个指定构造器(默认会有一个),并且通常也只有一个
  7. 类可以没有便利构造器
  8. 类的构造器器代理
    1. 指定构造器必须调用直接父类的指定构造器
    2. 便利构造器必须调用本类中的其他构造器
    3. 便利构造器最终必须调用本类的指定构造器

      值类型(结构体、枚举)中的指定构造器可以调用本类中的指定构造器,但是引用类型(类)中的指定构造器只能调用直接父类的指定构造器

  9. 对于两段初始化(Two-Phase Initialization)这里只有一点要提醒:只有当整个继承链上的所有类的属性都被初始化以后,才能使用self
  10. 初始化器的继承:
    1. Swift中,子类默认不会继承父类的构造器器
    2. 使用override关键字来重写父类的构造器
    3. 子类不能继承父类的便利构造器
    4. 子类可以修改父类的变量属性(父类初始化完成以后),但是不能修改常量属性,因为父类的常量在父类初始化过程中已经有值了,常量一经赋值不能更改
    5. 如果子类没有自定义任何的指定构造器方法(便利构造器可有可无)或者重写了(可以通过指定构造器或者便利构造器重写)父类的所有指定构造器方法,那么子类就会自动继承父类的所有构造器方法(包括指定构造器和便利构造器)
  11. 对于可失败的构造器,使用init?表示构造器可能失败,在可能失败的情况下return nil否则,不要return
    struct Animal {
        let species: String
        init?(species: String) {
            if species.isEmpty { return nil }
            self.species = species
        }
    }

就说到这里吧,后面还有一些用法请参考具体文档
虽然不多,也写了一下午,把这块的文档看了3遍。如果对你有用,请点个赞吧。有问题请留言,尽快回复。谢谢。

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

推荐阅读更多精彩内容

  • 官方文档 初始化 Initialization是为准备使用类,结构体或者枚举实例的一个过程。这个过程涉及了在实例里...
    hrscy阅读 1,135评论 0 1
  • 本章将会介绍 存储属性的初始赋值自定义构造过程默认构造器值类型的构造器代理类的继承和构造过程可失败构造器必要构造器...
    寒桥阅读 769评论 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,794评论 1 10
  • 构造过程 构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例可用前必须执行这个过程,具体操作包括设置...
    蛊毒_阅读 724评论 0 2
  • 我听过一个富豪小羽的发家史,看似简单实则绝非偶然。 那是起于一种创新,对传统工艺的革新铺陈出光明的前景。创新是人类...
    Amy花魅千夜阅读 182评论 0 16