Swift学习( 十一:构造过程2)

1.可失败构造器
  • 语法为在init关键字后面添加问好init?

  • 可失败构造器的参数名和参数类型,不能与其它非可失败构造器的参数名及参数类型相同。

  • 可失败构造器会创建一个类型为自身的可选类型的对象,通过return nil语句表明可失败构造器在任何情况下应该失败

      struct Animal {
          let species: String
          init?(species: String) {
              if species.isEmpty { return nil }
              self.species = species
          }
      }
      //如果species这个字符串为空,则构造失败。
    
      let someCreature = Animal(species: "Giraffe")
      // someCreature 的类型是 Animal? 而不是 Animal
    
      if let giraffe = someCreature {
          print("\(giraffe.species)")
      }
      // 打印 "Giraffe"
    
2.构造失败的传递

类,结构体,枚举的可失败构造器可以横向代理到类型中的其他可失败构造器。类似的,子类的可失败构造器也能向上代理到父类的可失败构造器。

无论是向上代理还是横向代理,如果你代理到的其他可失败构造器触发构造失败,整个构造过程将立即终止,接下来的任何构造代码不会再被执行。

3.可失败构造器 init!

通常来说我们通过在init关键字后添加问号的方式init?来定义一个可失败构造器,但你也可以通过在init后面添加惊叹号的方式来定义一个可失败构造器init!,该可失败构造器将会构建一个对应类型的隐式解包可选类型的对象。
你可以在init?中代理到init!,反之亦然。你也可以init?重写init!,反之亦然。你还可以用init代理到init!,不过,一旦init!构造失败,则会触发一个断言。

4.必要构造器

在类的构造器前添加required修饰符表明所有该类的子类都必须实现该构造器:

    class SomeClass {
        required init() {
            // 构造器的实现代码
        }
    }

通过闭包或函数设置属性的默认值

推荐阅读更多精彩内容