Как устранить конфликт между типами полей протокола и класса? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть протокол и класс, который я хочу расширить. Протокол требует поля некоторого типа, а у класса есть поле с тем же именем и типом, что и для Implicitly Unwrapped Необязательный для этого типа.

Может ли этот класс быть расширен этим протоколом? Если да, то как?

Если я пытаюсь написать расширение, Xcode выдает ошибку несоответствия. Но если я добавлю поле в расширение, оно выдаст ошибку переопределения.

protocol Named {
   var name: String { get }
}

class Person {
   var name: String!
}


extension Person: Named { 
// Type 'Finances.Account' does not conform to protocol 'Named'
}

1 Ответ

3 голосов
/ 11 апреля 2019

Имена и типы свойств, объявленные в 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 {

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...