Swift Typumwandlung
Die Typumwandlung in Swift kann den Typ einer Instanz bestimmen. Sie kann auch verwendet werden, um zu prüfen, ob ein Instanztyp zu einer Instanz seiner Oberklasse oder Unterklasse gehört.
In Swift wird Typumwandlung mit den Operatoren `is` und `as` implementiert. `is` wird verwendet, um den Typ eines Werts zu prüfen, und `as` wird verwendet, um den Typ umzuwandeln.
Typumwandlung kann auch verwendet werden, um zu prüfen, ob eine Klasse einem Protokoll entspricht.
Definieren einer Klassenhierarchie
Das Folgende definiert drei Klassen: Subjects, Chemistry und Maths. Chemistry und Maths erben von Subjects.
Der Code lautet wie folgt:
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: "千兆赫")]
let samplechem = Chemistry(physics: "固体物理", equations: "赫兹")
print("实例物理学是: \(samplechem.physics)")
print("实例方程式: \(samplechem.equations)")
let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫")
print("实例物理学是: \(samplemaths.physics)")
print("实例公式是: \(samplemaths.formulae)")
Wenn das obige Programm ausgeführt wird, lautet die Ausgabe:
Example physics is: solid state physics Example equation: Hertz Example physics is: fluid dynamics Example formula is: gigahertz
Typprüfung
Typumwandlung wird verwendet, um zu prüfen, ob ein Instanztyp zu einem bestimmten Instanztyp gehört.
Sie können sie auf Klassen- und Unterklassenhierarchien verwenden, um den Typ einer bestimmten Klasseninstanz zu prüfen und diese Klasseninstanz in einen anderen Typ innerhalb der Hierarchie umzuwandeln.
Die Typprüfung verwendet dasisSchlüsselwort.
Operatoris, um zu prüfen, ob eine Instanz zu einem bestimmten Untertyp gehört. Wenn die Instanz zu diesem Untertyp gehört, gibt der Typprüfungsoperator true zurück; andernfalls gibt er false zurück.
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 {
// 如果是一个 Chemistry 类型的实例,返回 true,相反返回 false.
if item is Chemistry {
++chemCount
} else if item is Maths {
++mathsCount
}
}
print("化学科目包含 \(chemCount) 个主题,数学包含 \(mathsCount) 个主题")
Wenn das obige Programm ausgeführt wird, lautet die Ausgabe:
实例物理学是: 固体物理 实例方程式: 赫兹 实例物理学是: 流体动力学 实例公式是: 千兆赫 化学科目包含 2 个主题,数学包含 3 个主题
Downcasting
Downcasting erfolgt mit dem Typumwandlungsoperator (as? oder as!)
Wenn du dir nicht sicher bist, ob das Downcasting erfolgreich sein wird, verwende die bedingte Form der Typumwandlung (as?). Die bedingte Form der Typumwandlung gibt immer einen optionalen Wert zurück, und wenn der Downcast nicht möglich ist, ist der optionale Wert nil.
Verwende die erzwungene Form (as!) nur, wenn du sicher bist, dass der Downcast erfolgreich sein wird. Wenn du versuchst, in einen falschen Typ downzucasten, löst die erzwungene Form der Typumwandlung einen Laufzeitfehler aus.
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)")
}
}
Wenn das obige Programm ausgeführt wird, lautet die Ausgabe:
Example physics is: solid state physics Example equation: Hertz Example physics is: fluid dynamics Example formula is: gigahertz Chemistry topic is: 'solid state physics', Hertz Mathematics topic is: 'fluid dynamics', gigahertz Chemistry topic is: 'thermal physics', decibel Mathematics topic is: 'astrophysics', megahertz Mathematics topic is: 'differential equations', cosine series
Typumwandlung für Any und AnyObject
Swift bietet zwei spezielle Typaliase für unspezifische Typen:
AnyObjectEs kann eine Instanz jedes Klassentyps darstellen.AnyEs kann jeden Typ darstellen, einschließlich Funktionstypen.
Hinweis:
Verwende es nur, wenn du sein Verhalten und seine Funktionalität ausdrücklich benötigstAnyundAnyObject. Es ist immer besser, den expliziten Typ zu verwenden, den du in deinem Code erwartest.
Any-Instanz
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类型的数组 exampleany
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")
}
}
Wenn das obige Programm ausgeführt wird, lautet die Ausgabe:
实例物理学是: 固体物理 实例方程式: 赫兹 实例物理学是: 流体动力学 实例公式是: 千兆赫 化学主题是: '固体物理', 赫兹 数学主题是: '流体动力学', 千兆赫 化学主题是: '热物理学', 分贝 数学主题是: '天体物理学', 兆赫 数学主题是: '微分方程', 余弦级数 整型值为 12 Pi 值为 3.14159 Any 实例 主题 '固体物理', 兆赫
AnyObject-Instanz
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)
}
}
// [AnyObject] 类型的数组
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")
}
}
Wenn das obige Programm ausgeführt wird, lautet die Ausgabe:
实例物理学是: 固体物理 实例方程式: 赫兹 实例物理学是: 流体动力学 实例公式是: 千兆赫 化学主题是: '固体物理', 赫兹 数学主题是: '流体动力学', 千兆赫 化学主题是: '热物理学', 分贝 数学主题是: '天体物理学', 兆赫 数学主题是: '微分方程', 余弦级数 整型值为 12 Pi 值为 3.14159 Any 实例 主题 '固体物理', 兆赫
In einem case eines switch-Statements verwendest du die erzwungene Form des Typumwandlungsoperators (as statt as?), um auf einen bestimmten Typ zu prüfen und ihn umzuwandeln.
Andere Erweiterungen