【问题标题】:Remove the redundant code from the following example从以下示例中删除冗余代码
【发布时间】:2018-12-20 15:25:38
【问题描述】:

我有 3 个结构:

struct A: Decodable {
    var color: UIColor? = nil
    var version: String? = nil
    // and few specific to struct A
}

struct B: Decodable {
    var color: UIColor? = nil
    var version: String? = nil
    // and few specific to struct B
}
    
struct C: Decodable {
    var color: UIColor? = nil
    var version: String? = nil
    // and few specific to struct C
}

我有一个UITableViewCell 子类,其中有一个函数configure(_ object: Any)。我正在传递这三个结构的实例并配置单元格。

我做了类似的事情:

func configure(_ object: Any) {
    if let aStruct = object as? A {
        view.color = aStruct.color
        label.text = aStruct.version
    } else if let bStruct = object as? B {
        view.color = aStruct.color
        label.text = aStruct.version
    } else if let cStruct = object as? C {
        view.color = aStruct.color
        label.text = aStruct.version
    }
}

但我对这种方法并不满意,因为它会导致冗余代码。你能建议我一种可以删除这些冗余代码的方法吗?

【问题讨论】:

    标签: swift generics protocols


    【解决方案1】:

    你可以制定协议

    protocol ProtocolName {
        var color: UIColor? { get set }
        var version: String? { get set }
    }
    

    然后你让 A、B 和 C 符合这个协议:

    struct A: Decodable, ProtocolName
    struct B: Decodable, ProtocolName
    struct C: Decodable, ProtocolName
    

    然后你更新:

    func configure(_ object: ProtocolName)
    

    这将使结构符合协议。然后在配置中,您将能够访问协议中声明的变量子集,而无需强制转换。

    查看此处了解更多信息https://www.appcoda.com/protocols-in-swift/

    【讨论】:

      最近更新 更多