AnyObject
требует, чтобы соответствующие типы были классами, а не структурами или перечислениями.Подробнее см. Протоколы только для класса .
Классы предоставляют ссылочную семантику, а не семантику значений, которая может потребоваться для вашего протокола.Например, если вы хотите наблюдать объект, это имеет смысл только для ссылочного типа (вы не можете наблюдать изменения типа значения, так как типы значений копируются при изменении).Подробнее об этом см. Структуры и классы и, в частности, разделы, объясняющие типы значений и ссылок.
Не существует эквивалента типа значения AnyObject
.Вы не можете требовать семантики значения для протокола.Это может привести к некоторым головным болям.В качестве примера различия рассмотрим следующее:
protocol Incrementing {
var value: Int { get set }
}
extension Incrementing {
func incremented() -> Self {
var new = self // Value types copy, reference types reference
new.value += 1
return new
}
}
struct S: Incrementing { var value: Int = 0 }
class C: Incrementing { var value: Int = 0 }
var s = S()
s.incremented().value // 1
s.value // 0
var c = C()
c.incremented().value // 1
c.value // 1 (!!!)
Этот код имеет смысл для структуры, но содержит ошибки для класса.Сегодня в Свифте нет реального решения этой проблемы.