Проверка типов приведения структуры и сравнения классов
В документации 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 - одним из его подклассов). Вы не можете сделать это со структурой, потому что структура никогда не может быть "надстройкой"; между структурами нет иерархии наследования.
Ваш код, с другой стороны, касается протокола и адепта, а это совсем другое дело. Ни один из ваших кодов не снижает структуру или класс; то, что вы делаете, - это понижающий уровень протокола, и, конечно, вы можете понижать его до любого адепта, будь то класс, структура или перечисление. Но, как я уже сказал, этот отрывок книги не об этом.