Что именно делает `: class` в объявлении протокола?

Это сообщение SO прекрасно объясняет, как решить проблему создания weak delegate .

По существу, есть два подхода:

Использование @objc слова @objc :

 @objc protocol MyClassDelegate { } class MyClass { weak var delegate: MyClassDelegate? } 

Использование ключевого слова: :class :

 protocol MyClassDelegate: class { } class MyClass { weak var delegate: MyClassDelegate? } 

Я пытаюсь сделать некоторые исследования, чтобы понять, какие именно различия между этими двумя подходами. Документы довольно понятны в использовании @objc :

Чтобы быть доступным и пригодным для использования в Objective-C, класс Swift должен быть потомком класса Objective-C или должен быть помечен как @objc .

Однако нигде я не нашел информации о том, что :class действительно делает. Рассматривая все понятие в деталях, на самом деле это не имеет большого смысла. Я понимаю, что class является ключевым словом в Swift для объявления классов. Итак, здесь кажется, что мы используем сам class ключевого слова как протокол (поскольку мы добавляем его после : после объявления протокола).

Итак, почему это даже работает синтаксически и что именно он делает?

:class гарантирует, что только классы могут реализовать протокол. И это любой класс, а не только подклассы NSObject . @objc , с другой стороны, сообщает компилятору использовать сообщение Objective-C-style, передающее методы вызова, вместо использования функций vtable для поиска.

  • Как изменить размер шрифта UILabel в Swift?
  • Swift: как использовать статическую ячейку в динамическом UITableView
  • Могу ли я создать многоразовый файл .xib, который я могу просмотреть в раскадровке?
  • Синтаксис блока в Swift
  • Загрузка файла с помощью веб-представления
  • Как изменить цвет эможи?
  • Swift - изменение цвета и размера текста при использовании UIButton
  • Структура JSON с Swift и Alamofire
  • TableViewCell не перезагружается, как ожидалось
  • Воспроизведение видео в фоновом режиме с помощью AVPlayer, дающего проблемы с AspectFill и цикл
  • didActivate не вызывается CallKit
  • Давайте будем гением компьютера.