Swift 协议一致性

Posted

技术标签:

【中文标题】Swift 协议一致性【英文标题】:Swift Protocol Conformance 【发布时间】:2015-08-26 21:45:20 【问题描述】:

这是我正在玩弄的一组价值关系的示例。

protocol Configurable 
    func configure(data: Any?) -> Void


class RelatedObject 
    var x: String = ""
    var y: String = ""


class Example 
    var a: String = ""
    var b: String = ""
    var c: String = ""


extension Example: Configurable 
    func configure(data: Any?) //I want the parameter to be of type RelatedObject?, not Any?
    
        if let d = data as? RelatedObject  //I don't want to have to do this every time i implement Configurable on an object.
            //do stuff
            a = d.x
            b = d.y
            c = d.x + d.y
        
    

有没有办法让我的实现 Configurable 协议的类能够限制它们在函数签名中接受的特定类型的对象?

我觉得 Swift 会/可以/应该有办法避免我必须检查类类型以了解传递给我想要配置的对象的内容。

【问题讨论】:

【参考方案1】:

您正在协议定义中寻找类型别名。

protocol Configurable 
    typealias InputData
    func configure(data: InputData) -> Void

在任何实现您的协议的东西中,您都可以将 typealias 设置为您想要的类型。

class RelatedObject 
    var x: String = ""
    var y: String = ""


class Example 
    var a: String = ""
    var b: String = ""
    var c: String = ""


extension Example: Configurable 
    typealias InputData = RelatedObject 

    func configure(data: InputData)  
        a = data.x
        b = data.y
        c = data.x + data.y
    

【讨论】:

非常感谢!我和我的同事整天都在为此绞尽脑汁:) 很高兴它对您有所帮助。好好休息一周。

以上是关于Swift 协议一致性的主要内容,如果未能解决你的问题,请参考以下文章

Swift 协议一致性

Swift 协议函数:返回相同类型的一致性类

Objective-C 类型的 Swift 2 协议扩展和一致性

未检测到超类中声明的 Swift 协议一致性

通过框架之间的扩展实现 Swift 协议一致性

Swift21-协议