Swift 中类型转换使用 is 和 as 操作符实现,is 用于检测值的类型,as 用于转换类型。
检查类型
类型检查使用 is 关键字。
操作符 is 来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回 true,否则返回 false。
向下转型
向下转型,用类型转换操作符(as? 或 as!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| 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: "固体物理", equations: "赫兹"), Maths(physics: "流体动力学", formulae: "千兆赫"), Chemistry(physics: "热物理学", equations: "分贝"), Maths(physics: "天体物理学", formulae: "兆赫"), Maths(physics: "微分方程", formulae: "余弦级数")]
let samplechem = Chemistry(physics: "固体物理", equations: "赫兹") print("实例物理学是: \(samplechem.physics)") print("实例方程式: \(samplechem.equations)")
let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫") print("实例物理学是: \(samplemaths.physics)") print("实例公式是: \(samplemaths.formulae)")
var chemCount = 0 var mathsCount = 0
for item in sa { if let show = item as? Chemistry { print("化学主题是: '\(show.physics)', \(show.equations)") } else if let example = item as? Maths { print("数学主题是: '\(example.physics)', \(example.formulae)") } }
|
Any和AnyObject的类型转换
Swift为不确定类型提供了两种特殊类型别名:
- AnyObject可以代表任何class类型的实例。
- Any可以表示任何类型,包括方法类型(function types)。
Any 实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| 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: "固体物理", equations: "赫兹"), Maths(physics: "流体动力学", formulae: "千兆赫"), Chemistry(physics: "热物理学", equations: "分贝"), Maths(physics: "天体物理学", formulae: "兆赫"), Maths(physics: "微分方程", formulae: "余弦级数")]
let samplechem = Chemistry(physics: "固体物理", equations: "赫兹") print("实例物理学是: \(samplechem.physics)") print("实例方程式: \(samplechem.equations)")
let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫") print("实例物理学是: \(samplemaths.physics)") print("实例公式是: \(samplemaths.formulae)")
var chemCount = 0 var mathsCount = 0
for item in sa { if let show = item as? Chemistry { print("化学主题是: '\(show.physics)', \(show.equations)") } else if let example = item as? Maths { print("数学主题是: '\(example.physics)', \(example.formulae)") } }
var exampleany = [Any]()
exampleany.append(12) exampleany.append(3.14159) exampleany.append("Any 实例") exampleany.append(Chemistry(physics: "固体物理", equations: "兆赫"))
for item2 in exampleany { switch item2 { case let someInt as Int: print("整型值为 \(someInt)") case let someDouble as Double where someDouble > 0: print("Pi 值为 \(someDouble)") case let someString as String: print("\(someString)") case let phy as Chemistry: print("主题 '\(phy.physics)', \(phy.equations)") default: print("None") } }
|
AnyObject 实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| 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: "固体物理", equations: "赫兹"), Maths(physics: "流体动力学", formulae: "千兆赫"), Chemistry(physics: "热物理学", equations: "分贝"), Maths(physics: "天体物理学", formulae: "兆赫"), Maths(physics: "微分方程", formulae: "余弦级数")]
let samplechem = Chemistry(physics: "固体物理", equations: "赫兹") print("实例物理学是: \(samplechem.physics)") print("实例方程式: \(samplechem.equations)")
let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫") print("实例物理学是: \(samplemaths.physics)") print("实例公式是: \(samplemaths.formulae)")
var chemCount = 0 var mathsCount = 0
for item in saprint { if let show = item as? Chemistry { print("化学主题是: '\(show.physics)', \(show.equations)") } else if let example = item as? Maths { print("数学主题是: '\(example.physics)', \(example.formulae)") } }
var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Any 实例") exampleany.append(Chemistry(physics: "固体物理", equations: "兆赫"))
for item2 in exampleany { switch item2 { case let someInt as Int: print("整型值为 \(someInt)") case let someDouble as Double where someDouble > 0: print("Pi 值为 \(someDouble)") case let someString as String: print("\(someString)") case let phy as Chemistry: print("主题 '\(phy.physics)', \(phy.equations)") default: print("None") } }
|
在一个switch语句的case中使用强制形式的类型转换操作符(as, 而不是 as?)来检查和转换到一个明确的类型。