我有一个协议和一个要扩展的类。该协议要求使用某种类型的字段,并且该类具有与该类型的Implicitly Unwrapped Optional相同的名称和类型的字段。
可以通过此协议扩展此类吗?如果是,那怎么办?
如果我尝试编写扩展名,则Xcode会给出不符合的错误。但是,如果我将字段添加到扩展名中,则会出现重新声明错误。
protocol Named {
var name: String { get }
}
class Person {
var name: String!
}
extension Person: Named {
// Type 'Finances.Account' does not conform to protocol 'Named'
}
答案 0 :(得分:3)
在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 {
}