如何解决协议和类字段类型之间的冲突?

时间:2019-04-11 12:51:29

标签: swift swift-protocols swift-extensions

我有一个协议和一个要扩展的类。该协议要求使用某种类型的字段,并且该类具有与该类型的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'
}

1 个答案:

答案 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 {

}