2015-08-26 116 views
1

以下是我正在使用的一组价值关系的示例。Swift协议一致性

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 
     } 
    } 
} 

是否有我的类实现可配置的协议能够限制对象的特定类型的他们的函数签名中接受的方式?

我觉得Swift会/可能/应该有办法避免一种情况,我必须检查传递到我想要配置的对象的类类型。

回答

3

您正在寻找协议定义中的typealias。

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 
    } 
} 
+0

非常感谢!我的同事和我整天绞尽脑汁:) – 72A12F4E

+0

我很高兴它帮助你。本周休息很多。 –