English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift-Typumwandlung

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

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

Typumwandlung von Any und AnyObject

Swift bietet zwei spezielle Typaliases für unsichere Typen an:

  • AnyObjectkann jede Instanz eines class-Typs darstellen.
  • Anykann jede Art von Typ darstellen, einschließlich Methodentypen (function types).

Hinweis:
nur zu verwenden, wenn du deren Verhalten und Funktionen explizit benötigstAnyundAnyObjectImmer besser ist es, in deinem Code explizite Typen zu verwenden, die du erwartest.

Any-Beispiel

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

Beispiel für 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)
    }
}
// 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.