具有共同属性的对象

时间:2018-03-14 09:45:16

标签: swift

我有三个不同的类ABC以及一些公共属性。例如,所有这些都具有名为index的属性。所有这些都继承自其他类X,它没有属性index,我无法修改这些类(它来自框架)。现在我想创建这些类之一的实例化并设置index属性。我现在怎么做:

func returnPreparedObjet() -> X? {
    if some_condition1 {
        let a = A()
        a.index = 1
        return a
    }
    else if some_condition2 {
        let b = B()
        b.index = 1
        return b
    }
    else if some_condition3 {
        let c = C()
        c.index = 1
        return c
    }
    return nil
}

在没有重复.index = 1return行的情况下实现它的最佳选择是什么?我可以在ABC不从X继承的情况下实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

您可以使用通用协议对这三个类进行分组:

protocol Indexed {
    var index: Int { get set }
}

,并为这三个类添加一致性

extension A: Indexed {}
extension B: Indexed {}
extension C: Indexed {} 

扩展中不需要代码,因为类已经声明了可写的index属性。

然后,您可以将returnPreparedObject简化为以下内容:

func returnPreparedObject() -> X? {
    let result: (X & Indexed)?
    if some_condition1 {
        result = A()
    } else if some_condition2 {
        result = B()
    } else if some_condition3 {
        result = C()
    }
    result?.index = 1
    return result
}