Объявление соответствия протоколу @objc в пустых расширениях с помощью EXC_BAD_INSTRUCTION

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

У меня есть два протокола и классBus который заявляет о соответствии одному из протоколов. Кроме того, пустое расширениеBus заявляет о соответствии другому протоколу:

import Foundation

@objc
protocol Displayable { var name: String {get} }

@objc
protocol Utterable { var utterance: String {get} }

class Bus : Displayable { var name = "a bus"; var utterance = "this is a bus"}

extension Bus : Utterable {}

var bus1 = Bus() // this line fails with EXC_BAD_INSTRUCTION

Вывод консоли может выглядеть случайным, но это не так. Я получаю это последовательно, если я пытаюсь создать экземплярBus:

objc[9658]: Method cache corrupted. This may be a message to an invalid object, or a memory error somewhere else.
objc[9658]: unused 0x0, SEL 0x10e4ce130, isa 0x1181f9ad0, cache 0x1181f9ae0, buckets 0x7fc491501060, mask 0x0, occupied 0x0
objc[9658]: unused 0 bytes, buckets 64 bytes
objc[9658]: selector 'resolveInstanceMethod:'
objc[9658]: isa '__lldb_expr_1314.Bus'
objc[9658]: Method cache corrupted.
Ошибка исчезнет, ​​если мы закомментируем все@objc атрибутыОшибка исчезнет, ​​если мы не будем соответствоватьUtterable: extension Bus: Utterable{}

Причина, по которой мои протоколыдолжен иметь атрибут@objc потому что в противном случае среда выполнения Obj-c будет жаловаться при попытке сделать такие вещи, какvar myDisplayables: [Displayable] = [ Bus() ] или иным образом динамически проверять соответствие протоколу

Опять же, обратите внимание, что это минимальный пример.

Обновление с Swift 1.2: Похоже, это сейчас исправлено. Xcode предлагает эти изменения «потому что протокол требует этого»:

class Bus : Displayable { @objc var name = "a bus"; @objc var utterance = "this is a bus"}

Ответы на вопрос(1)

Ваш ответ на вопрос