Я прочитал Расширения, доступные в Swift, и интересовался, поддерживаются ли статические protocol extensions
? Я знаю, что методы экземпляра можно использовать в protocol extension
.
Я хотел создать протокол для своего репозитория вместе с реализацией этого репозитория:
Реализация репозитория
public protocol NoteRepositoryProtocol {
func getAllNotes() -> [Note]
}
Обновлять
class NoteRepository : NoteRepositoryProtocol {
func getAllNotes() -> [Note] {
return [Note]()
}
}
Затем, чтобы сохранить слабую связь в моем приложении, я хотел создать репозиторий через фабрику. Я пытался быть умным и прикрепил статический метод к своим протоколам вот так:
public extension NoteRepositoryProtocol {
public static func createInstance() -> NoteRepositoryProtocol {
return NoteRepository()
}
}
Я знаю, что это можно сделать, если я опущу здесь ключевое слово static
, но я действительно хотел, чтобы оно было статическим, чтобы я мог сделать это:
func test_note_repository_returns_a_valid_note_repository() {
let repository = NoteRepositoryProtocol.createInstance()
}
Теперь, когда я хочу изменить реализацию своего репозитория, я могу сделать это, обновив метод фабрики расширения протокола. Другой альтернативой является создание реальной фабрики для обработки этого, но мне нравится идея фабричного метода, существующего в самом типе.
Когда я компилирую это, мне выдается следующая ошибка компилятора:
Команда не выполнена из-за сигнала: Недопустимая инструкция: 4
Вы не можете использовать статические методы в расширении протокола?
Я удалил утверждение модульного теста, чтобы устранить корень проблемы в исходном коде примера. Проблема в том, что компилятору не нравится мой вызов статического метода протокола.
необязательное никогда не может быть нулевым
Протокол репозитория