如何解决协议和 class 字段类型之间的冲突?
How to resolve collision between protocol and class fields types?
我有一个协议和一个要扩展的 class。该协议需要某种类型的字段,并且 class 具有与此类型的隐式解包可选字段具有相同名称和类型的字段。
这个 class 可以通过这个协议扩展吗?如果是,那又如何?
如果我尝试编写扩展,Xcode 会给出不符合的错误。但是,如果我将该字段添加到扩展中,则会出现重新声明错误。
protocol Named {
var name: String { get }
}
class Person {
var name: String!
}
extension Person: Named {
// Type 'Finances.Account' does not conform to protocol 'Named'
}
属性 在 protocol
中声明的名称和类型必须与符合规范的 class 完全匹配。
因此,如果不更改协议或符合类型中的 属性 类型,就无法解决错误。您还可以重命名其中一个属性,并将匹配的 属性 作为新字段添加到符合类型。
所以要么:
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
class 的可选性匹配的包装器协议,使该协议继承原始协议,在新协议的扩展中声明非可选变量并使 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 {
}
我有一个协议和一个要扩展的 class。该协议需要某种类型的字段,并且 class 具有与此类型的隐式解包可选字段具有相同名称和类型的字段。
这个 class 可以通过这个协议扩展吗?如果是,那又如何?
如果我尝试编写扩展,Xcode 会给出不符合的错误。但是,如果我将该字段添加到扩展中,则会出现重新声明错误。
protocol Named {
var name: String { get }
}
class Person {
var name: String!
}
extension Person: Named {
// Type 'Finances.Account' does not conform to protocol 'Named'
}
属性 在 protocol
中声明的名称和类型必须与符合规范的 class 完全匹配。
因此,如果不更改协议或符合类型中的 属性 类型,就无法解决错误。您还可以重命名其中一个属性,并将匹配的 属性 作为新字段添加到符合类型。
所以要么:
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
class 的可选性匹配的包装器协议,使该协议继承原始协议,在新协议的扩展中声明非可选变量并使 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 {
}