Как получить доступ к перечислению из другого класса в Swift?

Скажем, у меня есть следующий пример:

class ClassOne {
    enum Color {
        case Red
        case Blue
    }

    func giveColor() -> Color {
        return .Red
    }
}

class ClassTwo {
    let classOne = ClassOne()
    var color: Color = classOne.giveColor()
}

Компилятор жалуется, что он не знает, что Color находится в ClassTwo. Как мне лучше справиться с этим?

Ответ 1

Перечисление Color - это вложенный тип - вы получите доступ к нему как ClassOne.Color. Более того, вы не можете назначить одно свойство из другого в таком объявлении. Оставьте его неназначенным и сделайте это в init():

class ClassOne {
    enum Color {
        case Red
        case Blue
    }

    func giveColor() -> Color {
        return .Red
    }
}

class ClassTwo {
    let classOne = ClassOne()
    var color: ClassOne.Color

    init() {
        self.color = self.classOne.giveColor()
    }
}

Ответ 2

Вы не можете использовать значение по умолчанию для одного свойства по умолчанию для другого. Вы можете исправить это, установив цвет в методе init:

class ClassTwo {
    let classOne: ClassOne = ClassOne()
    var color: ClassOne.Color
    init(){
        color = classOne.giveColor()
    }
}

Так как Color является перечислением внутри ClassOne, для его типа вы должны использовать ClassOne.Color вместо Color.

Вы также можете сделать цвет вычисленным свойством следующим образом:

class ClassTwo {
    let classOne: ClassOne = ClassOne()
    var color: ClassOne.Color {
    get{
        return classOne.giveColor()
    } }
}

В первом примере Color устанавливается как classOne.giveColor() только тогда, когда он инициализирован, но во втором примере classOne.giveColor() вызывается каждый раз, когда вы пытаетесь получить доступ к Color.