第十八节 Swift 中的类型转换

在Swift中一般使用 is 关键字实现类型检查,使用 as关键字实现类型转换。

为类型转换定义类层次

下面定义了三个类:Person、Chinese和American。Chinese 和 American 是 Person的子类。

代码示例:

先定义一个 Person基类

class Person {
    var weight:Float
    init(weight:Float) {
        self.weight = weight
    }
}

再定义两个Person的子类

class Chinese: Person {
    var name:String = "张三"
    init(name:String,weight:Float) {
        super.init(weight: weight)
        self.name = name
    }
}

class American: Person {
    var age:Int = 30
    init(age:Int,weight:Float) {
        super.init(weight: weight)
        self.age = age
    }    
}

最后创建一个名为 People的数组,包含两个 Chinese实例和两个 American实例。

People数组的类型是在初始化的时候根据包含的实例推断出来,Swift类型检查器可以推断 Chinese和 American有一个共同的父类 Person,所以 People的类型推断为 [Person]。

let People = [
Chinese(name: "张三", weight: 50.0),
American(age: 30, weight: 60.0),
Chinese(name: "李四", weight: 55.0),
American(age: 40, weight: 65.0)
]
// "People" 的类型被推断为[Person]

类型检查

通过类型检查操作符 ( is )来检查一个实例是否属于一个特定的子类。
如果实例是该子类类型,类型检查操作符返回 true ,否则返回 false 。

代码示例

var ChineseCount = 0
var AmericanCount = 0
 
for people in People {
    if people is Chinese {
        ChineseCount += 1
    } else if item is American {
        AmericanCount += 1
    }
}

类型转换

as 和 is相比,除了可以检查类型外,还可以访问子类的属性或方法。

代码示例

for person in Person {
  if let chi = person as? Chinese {
    print(chi.name)
  } else if let ame = person as? American {
    print(ame.age)
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。