Подтвердить что ты не робот

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()

... он все еще падает в первой строке.

4b9b3361

Ответ 1

Это ошибка компилятора, приводящая к переполнению стека при доступе к свойству localObjects. Из того, что я могу собрать, это проблема с рекурсивной зависимостью между вашими типами, и более конкретно, что localObjects вызывается посредством динамической отправки. Если я удалю static var localObjects: ResourceFinderType { get } из Resource, он будет работать.

В качестве альтернативы, если вы удалите ограничение Resource из ResourceFinder, оно также будет успешно запущено.

Я сообщил об этой проблеме, и вы можете отслеживать ее через SR-1314