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) {} {} let sa = [ Химия(физика: "кристаллофизика", уравнения: "герцы"), Maths(physics: "Гидродинамика", formulae: "Терагерцы") let samplechem = Chemistry(physics: "solid physics", equations: "герцы") print("Пример физики: \(samplechem.physics)") print("Пример уравнения: \(samplechem.equations)") let samplemaths = Maths(physics: "hydrodynamics", formulae: "терагерцы") print("Пример физики: \(samplemaths.physics)") print("Пример формулы: \(samplemaths.formulae)")
Результат выполнения программы:
Пример физики: физика твердого тела Пример уравнения: гertz Пример физики: гидродинамика Пример формулы: гигагерцы
Типовое преобразование используется для проверки, принадлежит ли тип примера определенному типу примера.
Его можно использовать на иерархии классов и подклассов, чтобы проверить тип примера класса и преобразовать тип примера класса в другой тип в этой иерархии.
Типовая проверка использует 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) {} {} let sa = [ Химия(физика: "кристаллофизика", уравнения: "герцы"), Maths(физика: "гидродинамика", формулы: "терагерцы"), Химия(физика: "термофизика", уравнения: "дБ"), Maths(физика: "астрофизика", формулы: "гигагерцы"), Maths(physics: "дифференциальное уравнение", formulae: "cosинусные ряды")] let samplechem = Chemistry(physics: "solid physics", equations: "герцы") print("Пример физики: \(samplechem.physics)") print("Пример уравнения: \(samplechem.equations)") let samplemaths = Maths(physics: "hydrodynamics", 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) темы")
Результат выполнения программы:
Пример физики: физика твердого тела Пример уравнения: гertz Пример физики: гидродинамика Пример формулы: гигагерцы Химические науки включают 2 темы, математика включает 3 темы
Типовое преобразование, использование оператора преобразования типа (as? или as!)
Используйте условную форму преобразования типов (as?) когда вы не уверены, что внизовой转型 может succeed. Условная форма преобразования типов всегда возвращает опциональное значение (optional value), и если внизовой трансформации не возможно, опциональное значение будет nil.
Используйте强制性 форму (as!) только когда вы уверены, что внизовой转型一定会 succeed. При попытке внизового转型 в неправильный тип,强制性 форма преобразования типов вызывает ошибку времени выполнения.
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 = [ Химия(физика: "кристаллофизика", уравнения: "герцы"), Maths(физика: "гидродинамика", формулы: "терагерцы"), Химия(физика: "термофизика", уравнения: "дБ"), Maths(физика: "астрофизика", формулы: "гигагерцы"), Maths(physics: "дифференциальное уравнение", formulae: "cosинусные ряды")] let samplechem = Chemistry(physics: "solid physics", equations: "герцы") print("Пример физики: \(samplechem.physics)") print("Пример уравнения: \(samplechem.equations)") let samplemaths = Maths(physics: "hydrodynamics", 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)") {} {}
Результат выполнения программы:
Пример физики: физика твердого тела Пример уравнения: гertz Пример физики: гидродинамика Пример формулы: гигагерцы Химическая тема: 'Физика твердого тела', гertz Математическая тема: 'Гидродинамика', гигагерцы Химическая тема: 'Тепловая физика', децибели Математическая тема: 'Астрофизика', мегагерцы Математическая тема: 'Дифференциальное уравнение', косинусные ряды
Swift предоставляет два специальных типа алиасов для неопределённых типов:
AnyObject
может представлять собой любой пример класса.Any
может представлять собой любой тип, включая типы методов (function types).Внимание:
используйте их только когда вам явно нужны их поведение и функцииAny
и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) {} {} let sa = [ Химия(физика: "кристаллофизика", уравнения: "герцы"), Maths(физика: "гидродинамика", формулы: "терагерцы"), Химия(физика: "термофизика", уравнения: "дБ"), Maths(физика: "астрофизика", формулы: "гигагерцы"), Maths(physics: "дифференциальное уравнение", formulae: "cosинусные ряды")] let samplechem = Chemistry(physics: "solid physics", equations: "герцы") print("Пример физики: \(samplechem.physics)") print("Пример уравнения: \(samplechem.equations)") let samplemaths = Maths(physics: "hydrodynamics", 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 var exampleany = [Any]() exampleany.append(12) exampleany.append(3.14159) exampleany.append("Any пример") exampleany.append(Chemistry(physics: "solid physics", equations: "гигагерцы")) for item2 in exampleany { switch item2 { case let someInt as Int: print("Значение целого числа составляет \(someInt)") case let someDouble as Double where someDouble > 0: print("Значение числа Пи составляет \(someDouble)") case let someString as String: print("\(someString)") case let phy as Chemistry: print("Тема '\(phy.physics)', \(phy.equations)") default: print("None") {} {}
Результат выполнения программы:
Пример физики: физика твердого тела Пример уравнения: гertz Пример физики: гидродинамика Пример формулы: гигагерцы Химическая тема: 'Физика твердого тела', гertz Математическая тема: 'Гидродинамика', гигагерцы Химическая тема: 'Тепловая физика', децибели Математическая тема: 'Астрофизика', мегагерцы Математическая тема: 'Дифференциальное уравнение', косинусные ряды Целочисленный значение равно 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(physics: physics) {} {} class Maths: Subjects { var formulae: String init(physics: String, formulae: String) { self.formulae = formulae super.init(physics: physics) {} {} // массив типа AnyObject let saprint: [AnyObject] = [ Химия(физика: "кристаллофизика", уравнения: "герцы"), Maths(физика: "гидродинамика", формулы: "терагерцы"), Химия(физика: "термофизика", уравнения: "дБ"), Maths(физика: "астрофизика", формулы: "гигагерцы"), Maths(physics: "дифференциальное уравнение", formulae: "cosинусные ряды")] let samplechem = Chemistry(physics: "solid physics", equations: "герцы") print("Пример физики: \(samplechem.physics)") print("Пример уравнения: \(samplechem.equations)") let samplemaths = Maths(physics: "hydrodynamics", 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: "solid physics", equations: "гигагерцы")) for item2 in exampleany { switch item2 { case let someInt as Int: print("Значение целого числа составляет \(someInt)") case let someDouble as Double where someDouble > 0: print("Значение числа Пи составляет \(someDouble)") case let someString as String: print("\(someString)") case let phy as Chemistry: print("Тема '\(phy.physics)', \(phy.equations)") default: print("None") {} {}
Результат выполнения программы:
Пример физики: физика твердого тела Пример уравнения: гertz Пример физики: гидродинамика Пример формулы: гигагерцы Химическая тема: 'Физика твердого тела', гertz Математическая тема: 'Гидродинамика', гигагерцы Химическая тема: 'Тепловая физика', децибели Математическая тема: 'Астрофизика', мегагерцы Математическая тема: 'Дифференциальное уравнение', косинусные ряды Целочисленный значение равно 12 Значение Pi равно 3.14159 Пример Any Тема 'Физика твердого тела', мегагерцы
В случае использования принудительного формата типа преобразования оператора (as, а не as?) для проверки и преобразования в явный тип в случае условия switch.