美文网首页
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-可失败构造器

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