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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决协议和类字段类型之间的冲突?相关的知识,希望对你有一定的参考价值。

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

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 {

}

以上是关于如何解决协议和类字段类型之间的冲突?的主要内容,如果未能解决你的问题,请参考以下文章

网络协议和管理

Http TCP/IP协议和socket之间的区别和联系

如何在 Swift 中正确实现不同视图控制器之间的协议和委托?

IOS-协议和代理

符合协议和类的 Swift 属性

前端笔记三前后端通信(http协议和Ajax)