У меня есть протокол с typealias:Использование протокола с typealias как свойство
protocol Archivable {
typealias DataType
func save(data: DataType, withNewName newName: String) throws
func load(fromFileName fileName: String) throws -> DataType
}
и класс, который соответствует этому протоколу:
class Archiver: Archivable {
typealias DataType = Int
func save(data: DataType, withNewName newName: String) throws {
//saving
}
func load(fromFileName fileName: String) throws -> DataType {
//loading
}
}
, и я хотел бы использовать Archivable
как свойство в другом классе, как:
class TestClass {
let arciver: Archivable = Archiver() //error here: Protocol 'Archivable' can only be used as a generic constraint because it has Self or associated type requiments
}
но он терпит неудачу с
Протокол долгосрочного хранение »может быть использована только в качестве общего ограничения, поскольку он имеет Самость или связанное requiments типа
Моя цель состоит в том, что TestClass
должен видеть только Archiver
, как Archiveable
, так что если я хочу, чтобы изменить я просто должен создать новый класс, который соответствует Archivable
, поскольку он задан как свойство в TestClass
, но я не знаю, возможно ли это, и если да, то как.
И я бы хотел избежать использования AnyObject
вместо DataType.
чтения: [ссылка] (http://krakendev.io/blog/generic-protocols-and-their-shortcomings) –
@RMenke спасибо за ссылку, так что в основном этот подход не работает: \ –
На данный момент генерики только частично реализованы. Одна из целей Swift 3 - сделать его полностью родовым. Создание всего родового - это последняя тенденция, но она просто не играет хорошо с тем, как работает Swift. Каждый тип должен быть известен во время компиляции, а генерики в Swift просто не могут этого сделать в каждом случае. Я лично стараюсь избегать дженериков вообще. –