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

Swift базовый учебник

Операторы Swift

Swift управление потоком

Swift коллекции

Swift функция

Swift продвинутый

Типовые преобразования в Swift

Типовое преобразование в 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
Математическая тема: 'Гидродинамика', гигагерцы
Химическая тема: 'Тепловая физика', децибели
Математическая тема: 'Астрофизика', мегагерцы
Математическая тема: 'Дифференциальное уравнение', косинусные ряды

Типы Any и AnyObject и их преобразования

Swift предоставляет два специальных типа алиасов для неопределённых типов:

  • AnyObjectможет представлять собой любой пример класса.
  • Anyможет представлять собой любой тип, включая типы методов (function types).

Внимание:
используйте их только когда вам явно нужны их поведение и функцииAnyиAnyObjectВ вашем коде всегда лучше использовать ожидаемый明确的 тип.

Пример 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)
    {}
{}
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
Тема 'Физика твердого тела', мегагерцы

Пример 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)
    {}
{}
// массив типа 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.