Objective- C Внешнее константное свойство для преобразования перечисления Swift - PullRequest
2 голосов
/ 29 марта 2020

Я хотел сделать перечисление с типом Contacts framework CNLabeledValue * CNPhoneNumber, которые определены как:

// Generic labels
CONTACTS_EXTERN NSString * const CNLabelHome    NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNLabelWork    NS_AVAILABLE(10_11, 9_0);
CONTACTS_EXTERN NSString * const CNLabelSchool  NS_AVAILABLE(10_15, 13_0);
CONTACTS_EXTERN NSString * const CNLabelOther   NS_AVAILABLE(10_11, 9_0);

Я сделал что-то вроде этого:

enum CNLabeledValueType: String {
    case home
    case work
    case school
    case other

    var rawValue: String {
        switch self {
        case .home:
            return CNLabelHome
        case .work:
            return CNLabelHome
        case .school:
            return CNLabelSchool
        default:
            return CNLabelOther
        }
    }
}

Но я думаю, что мне все еще нужно сделать какое-нибудь отображение перечисления на правильные строки времени выполнения, нужно ли мне как-то также переопределить инициализацию перечисления?

То, чего я хотел бы достичь, было бы таким же результат, как если бы это было возможно:

enum CNLabeledValueType: String {
    case home = CNLabelHome
    case work = CNLabelWork
    case school = CNLabelSchool
    case other = CNLabelOther
}

Но это невозможно, потому что перечисления Swift требуют, чтобы «необработанное значение для перечисления должно быть строковым литералом», как жалуется компилятор. Так есть ли способ сделать что-то похожее, используя вычисляемые свойства, чтобы можно было переключаться по строке случая, а также получать правильное вычисленное значение строки во время выполнения для каждого случая?

1 Ответ

0 голосов
/ 29 марта 2020

Вы можете реализовать init(rawValue:) следующим образом:

init?(rawValue: String) {
    switch rawValue {
    case CNLabelHome:
        self = .home
    case CNLabelWork:
        self = .work
    case CNLabelSchool:
        self = .school
    case CNLabelOther:
        self = .other
    default:
        return nil
    }
}

Также обратите внимание, что в реализации rawValue имеется опечатка. Второй случай должен вернуть CNLabelWork. Я также предлагаю не использовать default: в операторе переключения необработанных значений:

var rawValue: String {
    switch self {
    case .home:
        return CNLabelHome
    case .work:
        return CNLabelWork
    case .school:
        return CNLabelSchool
    case .other:
        return CNLabelOther
    }
}

Таким образом, когда вы захотите добавить новую метку, в операторе switch появится ошибка, поэтому вы выиграли ' не забудьте добавить еще один случай.

...