Слабый "не должен применяться к неклассическому рассмотрению, добавляя соответствие протокола, которое имеет класс bound [duplicate]

Похоже, что вы отсутствуете, включая IOBluetooth.framework в своем проекте. Вы можете добавить его по:

-Нажмите на свой проект в левом верхнем углу левой панели (синий значок).

. На средней панели щелкните вкладку «Фазы построения».

-Включить «Связывание двоичных файлов с библиотеками», нажмите кнопку «плюс».

-Закройте IOBluetooth.framework из списка и нажмите Добавить.

enter image description here [/g0]

enter image description here [/g1]

Это позволит убедиться, что определения IOBluetooth.framework найдены компоновщиком , Вы можете видеть, что фреймворк является членом вашей цели, щелкнув фреймворк в левой панели и увидев целевое членство структуры в правой панели (обратите внимание, что я переместил структуру в группе Frameworks для целей организации):

enter image description here [/g2]

20
задан boog 2 November 2015 в 07:25
поделиться

2 ответа

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.

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

36
ответ дан Martin R 18 August 2018 в 06:00
поделиться

Вы можете сделать протокол полученным из любого типа класса, такого как NSObject или AnyObject. например:

protocol TopNewsTableDelegate  : AnyObject{
  func topNewsTableDidLoadedStories()
}
0
ответ дан Sachindra Pandey 18 August 2018 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: