Swift - 类型转换

  • 简述

    为了验证实例的类型,“类型转换”在 Swift 4 语言中发挥作用。它用于检查实例类型是否属于特定的超类或子类,或者它是在自己的层次结构中定义的。
    Swift 4 类型转换提供了两个运算符“is”来检查值的类型和“as”并将类型值转换为不同的类型。类型转换还会检查实例类型是否遵循特定的协议一致性标准。
  • 定义类层次结构

    类型转换用于检查实例的类型,以确定它是否属于特定的类类型。此外,它会检查类及其子类的层次结构,以检查并强制转换这些实例以使其成为相同的层次结构。
    
    class Subjects {
       var physics: String
       init(physics: String) {
          self.physics = physics
       }
    }
    class Chemistry: Subjects {
       var equations: String
       init(physics: String, equations: String) {
          self.equations = equations
          super.init(physics: physics)
       }
    }
    class Maths: Subjects {
       var formulae: String
       init(physics: String, formulae: String) {
          self.formulae = formulae
          super.init(physics: physics)
       }
    }
    let sa = [ Chemistry(physics: "solid physics", equations: "Hertz"),
       Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")]
    let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
    print("Instance physics is: \(samplechem.physics)")
    print("Instance equation is: \(samplechem.equations)")
    let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
    print("Instance physics is: \(samplemaths.physics)")
    print("Instance formulae is: \(samplemaths.formulae)")
    
    当我们使用playgrond运行上述程序时,我们得到以下结果 -
    
    Instance physics is: solid physics
    Instance equation is: Hertz
    Instance physics is: Fluid Dynamics
    Instance formulae is: Giga Hertz
    
  • 类型检查

    类型检查是通过“is”运算符完成的。“is”类型检查运算符检查实例是否属于特定子类类型,如果它属于该实例,则返回“true”,否则返回“false”。
    
    class Subjects {
       var physics: String
       init(physics: String) {
          self.physics = physics
       }
    }
    class Chemistry: Subjects {
       var equations: String
       init(physics: String, equations: String) {
          self.equations = equations
          super.init(physics: physics)
       }
    }
    class Maths: Subjects {
       var formulae: String
       init(physics: String, formulae: String) {
          self.formulae = formulae
          super.init(physics: physics)
       }
    }
    let sa = [
       Chemistry(physics: "solid physics", equations: "Hertz"),
       Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"),
       Chemistry(physics: "Thermo physics", equations: "Decibels"),
       Maths(physics: "Astro Physics", formulae: "MegaHertz"),
       Maths(physics: "Differential Equations", formulae: "Cosine Series")]
    let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
    print("Instance physics is: \(samplechem.physics)")
    print("Instance equation is: \(samplechem.equations)")
    let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
    print("Instance physics is: \(samplemaths.physics)")
    print("Instance formulae is: \(samplemaths.formulae)")
    var chemCount = 0
    var mathsCount = 0
    for item in sa {
       if item is Chemistry {
          ++chemCount
       } else if item is Maths {
          ++mathsCount
       }
    }
    print("Subjects in chemistry contains \(chemCount) topics and maths contains \(mathsCount) topics")
    
    当我们使用playgrond运行上述程序时,我们得到以下结果 -
    
    Instance physics is: solid physics
    Instance equation is: Hertz
    Instance physics is: Fluid Dynamics
    Instance formulae is: Giga Hertz
    Subjects in chemistry contains 2 topics and maths contains 3 topics
    
  • 向下转换

    向下转换子类类型可以使用两个运算符(as? 和 as!)来完成。'as?' 当值返回 nil 时返回一个可选值。它用于检查成功的向下转换。
    'as!' 当向下转换返回 nil 值时,返回强制展开,如可选链接中所述。它用于在向下转型失败的情况下触发运行时错误
    
    class Subjects {
       var physics: String
       init(physics: String) {
          self.physics = physics
       }
    }
    class Chemistry: Subjects {
       var equations: String
       init(physics: String, equations: String) {
          self.equations = equations
          super.init(physics: physics)
       }
    }
    class Maths: Subjects {
       var formulae: String
       init(physics: String, formulae: String) {
          self.formulae = formulae
          super.init(physics: physics)
       }
    }
    let sa = [
       Chemistry(physics: "solid physics", equations: "Hertz"),
       Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"),
       Chemistry(physics: "Thermo physics", equations: "Decibels"),
       Maths(physics: "Astro Physics", formulae: "MegaHertz"),
       Maths(physics: "Differential Equations", formulae: "Cosine Series")]
    let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
    print("Instance physics is: \(samplechem.physics)")
    print("Instance equation is: \(samplechem.equations)")
    let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
    print("Instance physics is: \(samplemaths.physics)")
    print("Instance formulae is: \(samplemaths.formulae)")
    var chemCount = 0
    var mathsCount = 0
    for item in sa {
       if let print = item as? Chemistry {
          print("Chemistry topics are: '\(print.physics)', \(print.equations)")
       } else if let example = item as? Maths {
          print("Maths topics are: '\(example.physics)', \(example.formulae)")
       }
    }
    
    当我们使用playgrond运行上述程序时,我们得到以下结果 -
    
    Instance physics is: solid physics
    Instance equation is: Hertz
    Instance physics is: Fluid Dynamics
    Instance formulae is: Giga Hertz
    Chemistry topics are: 'solid physics', Hertz
    Maths topics are: 'Fluid Dynamics', Giga Hertz
    Chemistry topics are: 'Thermo physics', Decibels
    Maths topics are: 'Astro Physics', MegaHertz
    Maths topics are: 'Differential Equations', Cosine Series
    
  • 类型转换:任何和任何对象

    关键字“Any”用于表示属于任何类型(包括函数类型)的实例。
    
    class Subjects {
       var physics: String
       init(physics: String) {
          self.physics = physics
       }
    }
    class Chemistry: Subjects {
       var equations: String
       init(physics: String, equations: String) {
          self.equations = equations
          super.init(physics: physics)
       }
    }
    class Maths: Subjects {
       var formulae: String
       init(physics: String, formulae: String) {
          self.formulae = formulae
          super.init(physics: physics)
       }
    }
    let sa = [
       Chemistry(physics: "solid physics", equations: "Hertz"),
       Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"),
       Chemistry(physics: "Thermo physics", equations: "Decibels"),
       Maths(physics: "Astro Physics", formulae: "MegaHertz"),
       Maths(physics: "Differential Equations", formulae: "Cosine Series")]
    let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
    print("Instance physics is: \(samplechem.physics)")
    print("Instance equation is: \(samplechem.equations)")
    let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
    print("Instance physics is: \(samplemaths.physics)")
    print("Instance formulae is: \(samplemaths.formulae)")
    var chemCount = 0
    var mathsCount = 0
    for item in sa {
       if let print = item as? Chemistry {
          print("Chemistry topics are: '\(print.physics)', \(print.equations)")
       } else if let example = item as? Maths {
          print("Maths topics are: '\(example.physics)', \(example.formulae)")
       }
    }
    var exampleany = [Any]()
    exampleany.append(12)
    exampleany.append(3.14159)
    exampleany.append("Example for Any")
    exampleany.append(Chemistry(physics: "solid physics", equations: "Hertz"))
    for print in exampleany {
       switch print {
          case let someInt as Int:
             print("Integer value is \(someInt)")
          case let someDouble as Double where someDouble > 0:
             print("Pi value is \(someDouble)")
          case let someString as String:
             print("\(someString)")
          case let phy as Chemistry:   
             print("Topics '\(phy.physics)', \(phy.equations)")
          default:
             print("None")
       }
    }
    
    当我们使用playgrond运行上述程序时,我们得到以下结果 -
    
    Instance physics is: solid physics
    Instance equation is: Hertz
    Instance physics is: Fluid Dynamics
    Instance formulae is: Giga Hertz
    Chemistry topics are: 'solid physics', Hertz
    Maths topics are: 'Fluid Dynamics', Giga Hertz
    Chemistry topics are: 'Thermo physics', Decibels
    Maths topics are: 'Astro Physics', MegaHertz
    Maths topics are: 'Differential Equations', Cosine Series
    Integer value is 12
    Pi value is 3.14159
    Example for Any
    Topics 'solid physics', Hertz
    
  • 任何对象

    为了表示任何类类型的实例,使用了“AnyObject”关键字。
    
    class Subjects {
       var physics: String
       init(physics: String) {
          self.physics = physics
       }
    }
    class Chemistry: Subjects {
       var equations: String
       init(physics: String, equations: String) {
          self.equations = equations
          super.init(physics: physics)
       }
    }
    class Maths: Subjects {
       var formulae: String
       init(physics: String, formulae: String) {
          self.formulae = formulae
          super.init(physics: physics)
       }
    }
    let saprint: [AnyObject] = [Chemistry(physics: "solid physics", equations: "Hertz"),
       Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz"),
       Chemistry(physics: "Thermo physics", equations: "Decibels"),
       Maths(physics: "Astro Physics", formulae: "MegaHertz"),
       Maths(physics: "Differential Equations", formulae: "Cosine Series")]
    let samplechem = Chemistry(physics: "solid physics", equations: "Hertz")
    print("Instance physics is: \(samplechem.physics)")
    print("Instance equation is: \(samplechem.equations)")
    let samplemaths = Maths(physics: "Fluid Dynamics", formulae: "Giga Hertz")
    print("Instance physics is: \(samplemaths.physics)")
    print("Instance formulae is: \(samplemaths.formulae)")
    var chemCount = 0
    var mathsCount = 0
    for item in saprint {
       if let print = item as? Chemistry {
          print("Chemistry topics are: '\(print.physics)', \(print.equations)")
       } else if let example = item as? Maths {
          print("Maths topics are: '\(example.physics)', \(example.formulae)")
       }
    }
    var exampleany = [Any]()
    exampleany.append(12)
    exampleany.append(3.14159)
    exampleany.append("Example for Any")
    exampleany.append(Chemistry(physics: "solid physics", equations: "Hertz"))
    for print in exampleany {
       switch print {
          case let someInt as Int:
             print("Integer value is \(someInt)")
          case let someDouble as Double where someDouble > 0:
             print("Pi value is \(someDouble)")
          case let someString as String:
             print("\(someString)")
          case let phy as Chemistry:
             print("Topics '\(phy.physics)', \(phy.equations)")
          default:
             print("None")
       }
    }
    
    当我们使用playgrond运行上述程序时,我们得到以下结果 -
    
    Instance physics is: solid physics
    Instance equation is: Hertz
    Instance physics is: Fluid Dynamics
    Instance formulae is: Giga Hertz
    Chemistry topics are: 'solid physics', Hertz
    Maths topics are: 'Fluid Dynamics', Giga Hertz
    Chemistry topics are: 'Thermo physics', Decibels
    Maths topics are: 'Astro Physics', MegaHertz
    Maths topics are: 'Differential Equations', Cosine Series
    Integer value is 12
    Pi value is 3.14159
    Example for Any
    Topics 'solid physics', Hertz