Есть ли способ объявить константу внутри вычисляемого свойства в Swift 3?

В моем коде Swift 3 есть несколько таких свойств:

var dinActive: Bool {
    get { return UserDefaults.standard.bool (forKey: "bo", fallback: true) }
    set { UserDefaults.standard.set (newValue, forKey: "bo") }
}
var spdif1Active: Bool {
    get { return UserDefaults.standard.bool (forKey: "spdif1", fallback: true) }
    set { UserDefaults.standard.set (newValue, forKey: "spdif1") }
}

Интересно, смогу ли я сделать это более компактным. Например, я бы избегал повторения строкового литерала как в функциях получения, так и в функциях установки, как в let s = "bo". Возможно ли это каким-то образом?

Кроме того, мне интересно, смогу ли я превратить этот повторяющийся шаблон в еще более короткий код, как я мог бы сделать с классами и дженериками или с помощью макроса #define в C. Хотя, вероятно, это лучше задать в отдельном вопросе. Если у вас есть предложение по этому поводу, но на него пока нет ответа, просто добавьте комментарий, и я задам новый вопрос.


person Thomas Tempelmann    schedule 02.06.2017    source источник


Ответы (1)


вы можете создать для него константу let вне вашего класса. Например:

//declaring constant outside of class
let SPDif1Key: String = "spdif1"

class YourClass
{
    var dinActive: Bool {
        get { return UserDefaults.standard.bool (forKey: SPDif1Key, fallback: true) }
        set { UserDefaults.standard.set (newValue, forKey: SPDif1Key) }
    }
}
person Community    schedule 02.06.2017
comment
Спасибо, это очевидный ответ, но он нарушает ту местность, которую я хотел достичь. Я должен был указать на это как на непопулярный ответ на мой вопрос. Кстати, нет необходимости писать: String, поскольку этот тип неявно задается из строкового литерала. - person Thomas Tempelmann; 02.06.2017