English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Swift 语言类型转换可以判断示例的类型。也可以用于检测示例类型是否属于其父类或者子类的示例。
Swift 中类型转换使用 is 和 as 操作符实现,is 用于检测值的类型,as 用于转换类型。
类型转换也可以用来检查一个类是否实现了某个协议。
以下定义了三个类:Subjects、Chemistry、Maths,Chemistry 和 Maths 继承了 Subjects。
代码如下:
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) } } lässt sa = [ Chemie (Physik: "Festkörperphysik", Gleichungen: "Hertz"), Maths(physics: "流体动力学", formulae: "千兆赫") let samplechem = Chemistry(physics: "Festkörperphysik", equations: "Hertz") drucke("Beispielphysik ist: \(samplechem.physics)") drucke("Beispielgleichung ist: \(samplechem.equations)") let samplemaths = Maths(physics: "Hydrodynamik", formulae: "Gigahertz") drucke("Beispielphysik ist: \(samplemaths.physics)") drucke("Beispielformeln sind: \(samplemaths.formulae)")
Die Ausgabe des obigen Programms ist wie folgt:
Das Beispiel der Physik ist: Festkörperphysik Das Beispiel der Gleichung ist: Hertz Das Beispiel der Physik ist: Flüssigkeitsdynamik Das Beispiel der Formel ist: Gigahertz
类型转换用于检测示例类型是否属于特定的示例类型。
你可以将它用在类和子类的层次结构上,检查特定类示例的类型并且转换这个类示例的类型成为这个层次结构中的其他类型。
类型检查使用 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) } } lässt sa = [ Chemie (Physik: "Festkörperphysik", Gleichungen: "Hertz"), Mathematik (Physik: "Hydrodynamik", Formeln: "Gigahertz"), Chemie (Physik: "Thermophysik", Gleichungen: "Dezibel"), Maths(physics: "Astrophysik", formulae: "Gigahertz")}} Maths(physics: "Differentialgleichung", formulae: "Cosinusreihen")] let samplechem = Chemistry(physics: "Festkörperphysik", equations: "Hertz") drucke("Beispielphysik ist: \(samplechem.physics)") drucke("Beispielgleichung ist: \(samplechem.equations)") let samplemaths = Maths(physics: "Hydrodynamik", formulae: "Gigahertz") drucke("Beispielphysik ist: \(samplemaths.physics)") drucke("Beispielformeln sind: \(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) 个主题")
Die Ausgabe des obigen Programms ist wie folgt:
Das Beispiel der Physik ist: Festkörperphysik Das Beispiel der Gleichung ist: Hertz Das Beispiel der Physik ist: Flüssigkeitsdynamik Das Beispiel der Formel ist: Gigahertz Chemie-Fächer enthalten 2 Themen, Mathematik enthält 3 Thema
Downcast, mit dem Typumwandlungsoperator (as? oder as!)
Verwende den bedingten Modus (as?) der Typumwandlung, wenn du unsicher bist, ob die Downcast erfolgreich sein wird. Der bedingte Modus der Typumwandlung gibt immer einen Optional-Wert zurück und ist bei unmöglicher Downcast nil.
Verwende den obligatorischen Modus (as!) nur, wenn du sicher bist, dass die Downcast erfolgreich sein wird. Wenn du versucht, in einen falschen Typ umzuwandeln, führt der obligatorische Modus 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) } } lässt sa = [ Chemie (Physik: "Festkörperphysik", Gleichungen: "Hertz"), Mathematik (Physik: "Hydrodynamik", Formeln: "Gigahertz"), Chemie (Physik: "Thermophysik", Gleichungen: "Dezibel"), Maths(physics: "Astrophysik", formulae: "Gigahertz")}} Maths(physics: "Differentialgleichung", formulae: "Cosinusreihen")] let samplechem = Chemistry(physics: "Festkörperphysik", equations: "Hertz") drucke("Beispielphysik ist: \(samplechem.physics)") drucke("Beispielgleichung ist: \(samplechem.equations)") let samplemaths = Maths(physics: "Hydrodynamik", formulae: "Gigahertz") drucke("Beispielphysik ist: \(samplemaths.physics)") drucke("Beispielformeln sind: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { // Bedingungen für die Typumwandlung sonst falls let show = item as? Chemistry { drucke("Chemie-Thema ist: '\(show.physics)', \(show.equations)") // notwendige Form sonst falls let example = item as? Maths { drucke("Mathematikthema ist: '\(example.physics)', \(example.formulae)") } }
Die Ausgabe des obigen Programms ist wie folgt:
Das Beispiel der Physik ist: Festkörperphysik Das Beispiel der Gleichung ist: Hertz Das Beispiel der Physik ist: Flüssigkeitsdynamik Das Beispiel der Formel ist: Gigahertz Das chemische Thema ist: 'Festkörperphysik', Hertz Das mathematische Thema ist: 'Flüssigkeitsdynamik', Gigahertz Das chemische Thema ist: 'Thermophysik', Dezibel Das mathematische Thema ist: 'Kosmische Physik', Megahertz Das mathematische Thema ist: 'Differentialgleichung', Kosinusreihen
Swift bietet zwei spezielle Typaliases für unsichere Typen an:
AnyObject
kann jede Instanz eines class-Typs darstellen.Any
kann jede Art von Typ darstellen, einschließlich Methodentypen (function types).Hinweis:
nur zu verwenden, wenn du deren Verhalten und Funktionen explizit benötigstAny
undAnyObject
Immer besser ist es, in deinem Code explizite Typen zu verwenden, die du erwartest.
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) } } lässt sa = [ Chemie (Physik: "Festkörperphysik", Gleichungen: "Hertz"), Mathematik (Physik: "Hydrodynamik", Formeln: "Gigahertz"), Chemie (Physik: "Thermophysik", Gleichungen: "Dezibel"), Maths(physics: "Astrophysik", formulae: "Gigahertz")}} Maths(physics: "Differentialgleichung", formulae: "Cosinusreihen")] let samplechem = Chemistry(physics: "Festkörperphysik", equations: "Hertz") drucke("Beispielphysik ist: \(samplechem.physics)") drucke("Beispielgleichung ist: \(samplechem.equations)") let samplemaths = Maths(physics: "Hydrodynamik", formulae: "Gigahertz") drucke("Beispielphysik ist: \(samplemaths.physics)") drucke("Beispielformeln sind: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 for item in sa { // Bedingungen für die Typumwandlung sonst falls let show = item as? Chemistry { drucke("Chemie-Thema ist: '\(show.physics)', \(show.equations)") // notwendige Form sonst falls let example = item as? Maths { drucke("Mathematikthema ist: '\(example.physics)', \(example.formulae)") } } // kann Array vom Typ Any speichern exampleany var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Any-Beispiel") exampleany.append(Chemistry(physics: "Festkörperphysik", equations: "Gigahertz")) für item2 falls in exampleany { switch item2 { fall case, wenn someInt ein Int ist: drucke("Ganzzahl-Wert ist \(someInt)") fall case, wenn someDouble ein Double ist und someDouble > 0: drucke("Pi-Wert ist \(someDouble)") fall case, wenn someString ein String ist: print("\(someString)") case let phy as Chemistry: print("Thema '\(phy.physics)', \(phy.equations)") default: print("None") } }
Die Ausgabe des obigen Programms ist wie folgt:
Das Beispiel der Physik ist: Festkörperphysik Das Beispiel der Gleichung ist: Hertz Das Beispiel der Physik ist: Flüssigkeitsdynamik Das Beispiel der Formel ist: Gigahertz Das chemische Thema ist: 'Festkörperphysik', Hertz Das mathematische Thema ist: 'Flüssigkeitsdynamik', Gigahertz Das chemische Thema ist: 'Thermophysik', Dezibel Das mathematische Thema ist: 'Kosmische Physik', Megahertz Das mathematische Thema ist: 'Differentialgleichung', Kosinusreihen Ganzzahl-Wert ist 12 Pi-Wert ist 3.14159 Any-Beispiel Thema 'Festkörperphysik', Megahertz
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) } } // Array vom Typ [AnyObject] lässt saprint: [AnyObject] = [ Chemie (Physik: "Festkörperphysik", Gleichungen: "Hertz"), Mathematik (Physik: "Hydrodynamik", Formeln: "Gigahertz"), Chemie (Physik: "Thermophysik", Gleichungen: "Dezibel"), Maths(physics: "Astrophysik", formulae: "Gigahertz")}} Maths(physics: "Differentialgleichung", formulae: "Cosinusreihen")] let samplechem = Chemistry(physics: "Festkörperphysik", equations: "Hertz") drucke("Beispielphysik ist: \(samplechem.physics)") drucke("Beispielgleichung ist: \(samplechem.equations)") let samplemaths = Maths(physics: "Hydrodynamik", formulae: "Gigahertz") drucke("Beispielphysik ist: \(samplemaths.physics)") drucke("Beispielformeln sind: \(samplemaths.formulae)") var chemCount = 0 var mathsCount = 0 für item in saprint { // Bedingungen für die Typumwandlung sonst falls let show = item as? Chemistry { drucke("Chemie-Thema ist: '\(show.physics)', \(show.equations)") // notwendige Form sonst falls let example = item as? Maths { drucke("Mathematikthema ist: '\(example.physics)', \(example.formulae)") } } var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Any-Beispiel") exampleany.append(Chemistry(physics: "Festkörperphysik", equations: "Gigahertz")) für item2 falls in exampleany { switch item2 { fall case, wenn someInt ein Int ist: drucke("Ganzzahl-Wert ist \(someInt)") fall case, wenn someDouble ein Double ist und someDouble > 0: drucke("Pi-Wert ist \(someDouble)") fall case, wenn someString ein String ist: print("\(someString)") case let phy as Chemistry: print("Thema '\(phy.physics)', \(phy.equations)") default: print("None") } }
Die Ausgabe des obigen Programms ist wie folgt:
Das Beispiel der Physik ist: Festkörperphysik Das Beispiel der Gleichung ist: Hertz Das Beispiel der Physik ist: Flüssigkeitsdynamik Das Beispiel der Formel ist: Gigahertz Das chemische Thema ist: 'Festkörperphysik', Hertz Das mathematische Thema ist: 'Flüssigkeitsdynamik', Gigahertz Das chemische Thema ist: 'Thermophysik', Dezibel Das mathematische Thema ist: 'Kosmische Physik', Megahertz Das mathematische Thema ist: 'Differentialgleichung', Kosinusreihen Ganzzahl-Wert ist 12 Pi-Wert ist 3.14159 Any-Beispiel Thema 'Festkörperphysik', Megahertz
Verwenden Sie im case eines switch-Anweisung die obligatorische Form des Typumwandlungsoperators (as, nicht as?) zur Überprüfung und Umwandlung in einen klaren Typ.