Swift: EXC_BAD_ACCESS вызов метода из общего типа, который реализует протокол
Я работаю над проектом с Swift 2 и Xcode 7.3 и сталкиваюсь с ошибкой, которую я пока не могу понять.
Я создал протокол с именем Resource
, который имеет associatedtype
и static var
этого типа.
Внутри его расширения я пытаюсь создать стандартную реализацию getter static var
, где тип является общим struct
, который реализует другой protocol
, называемый ResourceFinderProtocol
.
Все компилируется хорошо, но во время выполнения при выполнении последней строки фрагмента ниже он вызывает сбой EXC_BAD_ACCESS
.
Если я делаю struct ResourceFinder
не общий, он работает плавно.
protocol Resource {
associatedtype ResourceFinderType
static var localObjects: ResourceFinderType { get }
}
extension Resource {
static var localObjects: ResourceFinder<Self> {
return ResourceFinder()
}
}
public protocol ResourceFinderProtocol {
associatedtype ResourceType
func all() -> [ResourceType]
}
struct ResourceFinder<T:Resource>: ResourceFinderProtocol {
func all() -> [T] {
return []
}
}
struct Model: Resource {}
Model.localObjects.all()
Любые идеи о том, что может происходить здесь?
EDIT:
Как заметил Александр, даже если я разделил вызов на:
let localObjects = Model.localObjects
let allObjects = localObjects.all()
... он все еще падает в первой строке.
Ответы
Ответ 1
Это ошибка компилятора, приводящая к переполнению стека при доступе к свойству localObjects
. Из того, что я могу собрать, это проблема с рекурсивной зависимостью между вашими типами, и более конкретно, что localObjects
вызывается посредством динамической отправки. Если я удалю static var localObjects: ResourceFinderType { get }
из Resource
, он будет работать.
В качестве альтернативы, если вы удалите ограничение Resource
из ResourceFinder
, оно также будет успешно запущено.
Я сообщил об этой проблеме, и вы можете отслеживать ее через SR-1314