У меня есть три разных класса A, B и C с некоторыми общими свойствами. Например, все они имеют свойство под названием 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 = 1 и return? Могу ли я добиться этого также в ситуации, когда A, B, C не наследуются от X?

0
Piotr Wasilewicz 14 Мар 2018 в 12:45

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
}
1
Cristik 14 Мар 2018 в 12:52