Unity: проект / нарисовать 3d объект на 2d плоскости

protocol A : class { ... }

определяет «протокол только для класса» : Только этот тип классов (а не структуры или перечисления) может принимать этот протокол.

Слабые ссылки определены только для ссылочные типы . Классы являются ссылочными типами, структурами и перечислениями являются типы значений. (Закрытия также являются ссылочными типами, но замыкания не могут принимать протокол, поэтому в этом контексте они неактуальны.) Поэтому, если ваш протокол определяет слабое свойство, тогда протокол должен быть протоколом только для классов.

Вот еще один пример, который требует только для протокола:

protocol A { 
    var name : String { get set }
}

func foo(a : A) {
    a.name = "bar" // error: cannot assign to property: 'a' is a 'let' constant
}

Это не скомпилируется, потому что для экземпляров структур и перечислений a.name = "bar" является мутацией a. Если вы определяете протокол как

protocol A : class { 
    var name : String { get set }
}

, то компилятор знает, что a является экземпляром типа класса, к которому a является ссылкой на хранилище объектов, а a.name = "bar" изменяет ссылающийся на объект, но не a.

Как правило, вы должны определить протокол только для классов, если вам нужны типы, принимающие протокол как ссылочные типы, а не типы значений.

1
задан genpfault 15 January 2019 в 21:46
поделиться