美文网首页
Swift-可失败构造器

Swift-可失败构造器

作者: 小驴拉磨 | 来源:发表于2018-07-02 15:18 被阅读23次

如果一个类、结构体或枚举类型的对象,在构造过程中有可能失败,则为其定义一个可失败构造器。这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某种所需的外部资源,又或是不满足某种必要的条件等。

为了妥善处理这种构造过程中可能会失败的情况。你可以在一个类,结构体或是枚举类型的定义中,添加一个或多个可失败构造器。其语法为在init关键字后面添加问号(init?)。

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

可失败构造器会创建一个类型为自身类型的可选类型的对象。你通过return nil语句来表明可失败构造器在何种情况下应该“失败”。

注意
严格来说,构造器都不支持返回值。因为构造器本身的作用,只是为了确保对象能被正确构造。因此你只是用return nil表明可失败构造器构造失败,而不要用关键字return来表明构造成功。

例如,实现针对数字类型转换的可失败构造器。确保数字类型之间的转换能保持精确的值,使用这个 init(exactly:) 构造器。如果类型转换不能保持值不变,则这个构造器构造失败。

let wholeNumber: Double = 12345.0
let pi = 3.14159

if let valueMaintained = Int(exactly: wholeNumber) {
    print("\(wholeNumber) conversion to Int maintains value")
}
// 打印 "12345.0 conversion to Int maintains value"

let valueChanged = Int(exactly: pi)
// valueChanged 是 Int? 类型, 不是 Int 类型

if valueChanged == nil {
    print("\(pi) conversion to Int does not maintain value")
}
// 打印 "3.14159 conversion to Int does not maintain value"

下例中,定义了一个名为Animal的结构体,其中有一个名为species的String类型的常量属性。同时该结构体还定义了一个接受一个名为species的String类型参数的可失败构造器。这个可失败构造器检查传入的参数是否为一个空字符串。如果为空字符串,则构造失败。否则,species属性被赋值,构造成功。

struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil }
        self.species = species
    }
}

你可以通过该可失败构造器来构建一个Animal的实例,并检查构造过程是否成功:

let someCreature = Animal(species: "Giraffe")
// someCreature 的类型是 Animal? 而不是 Animal

if let giraffe = someCreature {
    print("An animal was initialized with a species of \(giraffe.species)")
}
// 打印 "An animal was initialized with a species of Giraffe"

如果你给该可失败构造器传入一个空字符串作为其参数,则会导致构造失败:

let anonymousCreature = Animal(species: "")
// anonymousCreature 的类型是 Animal?, 而不是 Animal

if anonymousCreature == nil {
    print("The anonymous creature could not be initialized")
}
// 打印 "The anonymous creature could not be initialized"

注意
空字符串(如"",而不是"Giraffe")和一个值为nil的可选类型的字符串是两个完全不同的概念。上例中的空字符串("")其实是一个有效的,非可选类型的字符串。这里我们之所以让Animal的可失败构造器构造失败,只是因为对于Animal这个类的species属性来说,它更适合有一个具体的值,而不是空字符串。

原文出自51Swift转载请保留原文链接

相关文章

  • Swift-可失败构造器

    如果一个类、结构体或枚举类型的对象,在构造过程中有可能失败,则为其定义一个可失败构造器。这里所指的“失败”是指,如...

  • Swift 构造器

    一个可失败构造器不能代理另一个可失败构造器。 儿子可以失败,但是不能再走父亲的老路(失败构造器)。 但是儿子可以修...

  • iOS9 with Swift 类的构造器(四)

    可失败构造器(Failable initializers): 直到一个可失败构造器完成了它所有的初始化任务,它才可...

  • Initialization in Swift

    简介 *自定义构造过程 *默认构造器 *值类型的构造器代理 *类的继承和构造过程 *可失败构造器 *必需构造器 *...

  • iOS开发 - 「Swift 学习」Swift的构造过程(五)

    类的可失败构造器 如果类、结构体或是枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败的构造器 变...

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

    1.可失败构造器 语法为在init关键字后面添加问好init? 可失败构造器的参数名和参数类型,不能与其它非可失败...

  • Swift Tour Learn (八) -- Swift 语法

    本章将会介绍 存储属性的初始赋值自定义构造过程默认构造器值类型的构造器代理类的继承和构造过程可失败构造器必要构造器...

  • Swift可失败构造器

    可失败构造器适用于类,结构体,枚举类型语法为在init后加一个问号?,为init?()需要特别注意的是,可失败构造...

  • swift 8: 可失败构造器与可选链

    1:可失败构造器 1:简介 当使用构造器创建对象时,可以向构造器传递的形参无效或在构造器中使用函数外部的资源缺失,...

  • 14、【Swift】构造 / 初始化- Initializati

    与 Objective -C 不同,Swift 的构造器没有返回值(特殊情况,可失败构造器返回 nil)。 存储属...

网友评论

      本文标题:Swift-可失败构造器

      本文链接:https://www.haomeiwen.com/subject/nucluftx.html