English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La conversion de type en Swift peut juger du type d'un exemple. Il peut également être utilisé pour vérifier si le type d'un exemple appartient à un exemple de classe parente ou d'une sous-classe.
La conversion de type en Swift est réalisée par les opérateurs is et as, is est utilisé pour détecter le type d'une valeur, as pour convertir le type.
La conversion de type peut également être utilisée pour vérifier si une classe implémente un protocole.
Les trois classes suivantes sont définies : Subjects, Chemistry, Maths, Chemistry et Maths héritent de Subjects.
Le code suivant :
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(physique: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physique: physics) } } let sa = [ Chimie(physique: "physique des solides", équations: "hertz"), Maths(physics: "Hydrodynamique", formulae: "Gigahertz") let samplechem = Chemistry(physics: "固体物理", equations: "赫兹") print("示例物理学是: \(samplechem.physics)") print("示例方程式: \(samplechem.equations)") let samplemaths = Maths(physics: "流体动力学", formulae: "千兆赫") print("示例物理学是: \(samplemaths.physics)") print("示例公式是: \(samplemaths.formulae)")
程序执行输出结果为:
物理学示例是: 固体物理 方程式示例: 赫兹 物理学示例是: 流体动力学 公式示例是: 千兆赫
La conversion de type est utilisée pour détecter si le type d'un exemple appartient à un type d'exemple spécifique.
Vous pouvez l'utiliser sur une hiérarchie de classes et de sous-classes pour vérifier le type d'un exemple de classe spécifique et convertir cet exemple de classe en un autre type de cette hiérarchie.
Le contrôle de type utilise est mot-clé.
opérateur est Pour vérifier si un exemple appartient à un sous-type spécifique. Si l'exemple appartient à ce sous-type, l'opérateur de vérification de type retourne true, sinon retourne 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(physique: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physique: physics) } } let sa = [ Chimie(physique: "physique des solides", équations: "hertz"), Mathématiques(physique: "hydrodynamique", formules: "gigahertz"), Chimie(physique: "thermophysique", équations: "décibels"), 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 { // Si l'exemple est de type Chemistry, retourne true, sinon retourne false. if item is Chemistry { ++chemCount } else if item is Maths { ++mathsCount } } print("La discipline chimique contient \(chemCount) sujets, la mathématique contient \(mathsCount) sujets")
程序执行输出结果为:
物理学示例是: 固体物理 方程式示例: 赫兹 物理学示例是: 流体动力学 公式示例是: 千兆赫 les sujets de chimie contiennent 2 de sujets, les mathématiques contiennent 3 de sujets
Transformation vers le bas, en utilisant l'opérateur de conversion de type (as? ou as!)
Lorsque vous n'êtes pas sûr que la transformation vers le bas peut réussir, utilisez la forme conditionnelle de la conversion de type (as?). La conversion de type conditionnelle retourne toujours une valeur optionnelle (valeur optionnelle) et, si la transformation vers le bas est impossible, la valeur optionnelle sera nil.
Ne utilisez jamais la forme forceée (as!) que lorsque vous êtes sûr que la transformation vers le bas sera toujours réussie. Lorsque vous essayez de transformer vers un type incorrect, la conversion de type forceée déclenche une erreur de temps d'exécution.
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(physique: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physique: physics) } } let sa = [ Chimie(physique: "physique des solides", équations: "hertz"), Mathématiques(physique: "hydrodynamique", formules: "gigahertz"), Chimie(physique: "thermophysique", équations: "décibels"), 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 { // condition format of type conversion if let show = item as? Chemistry { print("化学主题是: '\(show.physics)', \(show.equations)") // force format } else if let example = item as? Maths { print("数学主题是: '\(example.physics)', \(example.formulae)") } }
程序执行输出结果为:
物理学示例是: 固体物理 方程式示例: 赫兹 物理学示例是: 流体动力学 公式示例是: 千兆赫 主题化学是: '固体物理', 赫兹 主题数学是: '流体动力学', 千兆赫 主题化学是: '热物理学', 分贝 主题化学是: '天体物理学', 兆赫 主题数学是: '微分方程', 级数余弦
Swift fournit deux alias spéciaux de types pour les types indéterminés :
AnyObject
peut représenter n'importe quel exemple de type class.Any
peut représenter n'importe quel type, y compris les types de fonctions (function types).Attention :
ne doivent être utilisés que lorsque vous avez besoin explicitement de leur comportement et de leurs fonctionnalitésAny
etAnyObject
Utiliser toujours le type explicite que vous attendez dans votre code est toujours mieux.
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(physique: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physique: physics) } } let sa = [ Chimie(physique: "physique des solides", équations: "hertz"), Mathématiques(physique: "hydrodynamique", formules: "gigahertz"), Chimie(physique: "thermophysique", équations: "décibels"), 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 { // condition format of type conversion if let show = item as? Chemistry { print("化学主题是: '\(show.physics)', \(show.equations)") // force format } else if let example = item as? Maths { print("数学主题是: '\(example.physics)', \(example.formulae)") } } // peut stocker un tableau de type 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") } }
程序执行输出结果为:
物理学示例是: 固体物理 方程式示例: 赫兹 物理学示例是: 流体动力学 公式示例是: 千兆赫 主题化学是: '固体物理', 赫兹 主题数学是: '流体动力学', 千兆赫 主题化学是: '热物理学', 分贝 主题化学是: '天体物理学', 兆赫 主题数学是: '微分方程', 级数余弦 值整型为 12 值Pi为 3.14159 示例Any 主题 '固体物理', 兆赫
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(physique: physics) } } class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physique: physics) } } // tableau d'objets AnyObject let saprint: [AnyObject] = [ Chimie(physique: "physique des solides", équations: "hertz"), Mathématiques(physique: "hydrodynamique", formules: "gigahertz"), Chimie(physique: "thermophysique", équations: "décibels"), 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 { // condition format of type conversion if let show = item as? Chemistry { print("化学主题是: '\(show.physics)', \(show.equations)") // force format } 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") } }
程序执行输出结果为:
物理学示例是: 固体物理 方程式示例: 赫兹 物理学示例是: 流体动力学 公式示例是: 千兆赫 主题化学是: '固体物理', 赫兹 主题数学是: '流体动力学', 千兆赫 主题化学是: '热物理学', 分贝 主题化学是: '天体物理学', 兆赫 主题数学是: '微分方程', 级数余弦 值整型为 12 值Pi为 3.14159 示例Any 主题 '固体物理', 兆赫
在一个switch语句的case中使用强制形式的类型转换操作符(as, 而不是 as?)来检查和转换到一个明确的类型。