Короткий ответ: вы не можете создать переменную на основе протокола.
Как указывается в официальной документации:
Протокол определяет схему методов, свойстви другие требования, которые удовлетворяют конкретной задаче или функциональности.Затем протокол может быть принят классом, структурой или перечислением, чтобы обеспечить фактическую реализацию этих требований.Говорят, что любой тип, который удовлетворяет требованиям протокола, соответствует этому протоколу.
Таким образом, минимальный объем работы, который требуется со стороны разработчиков, - это создание структуры или класса, который соответствуетопределенный протокол, скажем, Equatable
.
Давайте снова возьмем пример из официальной документации.Протокол Equatable
позволяет сравнивать два элемента одного типа, поэтому для его реализации необходимо реализовать метод ==(lhs: Type, rhs: Type,)
.
class StreetAddress {
let number: String
let street: String
let unit: String?
init(_ number: String, _ street: String, unit: String? = nil) {
self.number = number
self.street = street
self.unit = unit
}
}
extension StreetAddress: Equatable {
static func == (lhs: StreetAddress, rhs: StreetAddress) -> Bool {
return
lhs.number == rhs.number &&
lhs.street == rhs.street &&
lhs.unit == rhs.unit
}
}
Только теперь два экземпляра могутStreetAddress
создается и сравнивается на основе вашего предиката.