Проверка типов приведения структуры и сравнения классов

В документации Class vs Struct https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html одно из различий между Struct и Class заключается в

Приведение типов позволяет проверять и интерпретировать тип экземпляра класса во время выполнения.

Я пытаюсь понять, что это значит. Не могу понять, даже посмотрев на https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html

Я пробовал следующие коды

protocol Aprotocol { }

struct Bstruct: Aprotocol {
    func bDoThis() {
        print("B do this")
    }
}

class Cclass: Aprotocol {
    func cDoThis() {
        print("C do this")
    }
}

func dothing(a: Aprotocol) {
    
    switch a {
    case is Bstruct:
        print("this is B")
        (a as? Bstruct)?.bDoThis()
    case is Cclass:
        print("this is C")
        (a as? Cclass)?.cDoThis()
    default:
        print("this is not B")
    }
}

dothing(a: Bstruct())
dothing(a: Cclass())

В is и asработает как для Bstruct, так и для Cclass. для меня это проверка типов и приведение типов, которые, похоже, работают как для Struct, так и для класса. Я что-нибудь пропустил? Каково точное значение фразы "Приведение типов позволяет вам проверять и интерпретировать тип экземпляра класса во время выполнения"?

1 ответ

Рассматривать:

let v : UIView = UIButton()
(v as? UIButton)?.setTitle("howdy", for: .normal)

Это работает, потому что UIView является суперклассом (а UIButton - одним из его подклассов). Вы не можете сделать это со структурой, потому что структура никогда не может быть "надстройкой"; между структурами нет иерархии наследования.

Ваш код, с другой стороны, касается протокола и адепта, а это совсем другое дело. Ни один из ваших кодов не снижает структуру или класс; то, что вы делаете, - это понижающий уровень протокола, и, конечно, вы можете понижать его до любого адепта, будь то класс, структура или перечисление. Но, как я уже сказал, этот отрывок книги не об этом.

Другие вопросы по тегам