Имена и типы свойств, объявленные в protocol
, должны точно соответствовать соответствующим классам.
Таким образом, вы не можете устранить ошибку, не изменив тип свойства ни в протоколе, ни в соответствующем типе. Вы также можете переименовать одно из свойств и добавить соответствующее свойство в соответствующий тип как новое поле.
Так что либо сделайте:
protocol Named {
var name: String { get }
}
class Person {
var name: String
init(_ name:String) {
self.name = name
}
}
extension Person: Named {
}
Или
protocol Named {
var name: String { get }
}
class Person {
var _name: String!
}
extension Person: Named {
var name: String {
return _name
}
}
Как указал @ user28434, существует (неприятный) обходной путь. Вы можете создать протокол-оболочку, который соответствует необязательности класса Person
, сделать так, чтобы этот протокол наследовал от исходного протокола, объявить необязательную переменную в расширении нового протокола и вместо этого сделать Person
соответствующим новому протоколу. оригинала Named
.
protocol Named {
var name: String { get }
}
class Person {
var name: String!
}
protocol Namedd: Named {
var name: String! { get }
}
extension Namedd {
var name: String {
return name!
}
}
extension Person: Namedd {
}