2016-08-31 1 views
1

Меня тошнит от повторения бесчисленных coolFeatureEnabled струнных литералов при работе с UserDefaults. Если есть хороший способ избавиться от них с помощью Swift 3?Как избавиться от строковых литералов `forKey` в` UserDefaults` с помощью Swift 3?

var coolFeatureEnabled: Bool { 
    get { return UserDefaults.standard.bool(forKey: "coolFeatureEnabled") } 
    set { UserDefaults.standard.set(newValue, forKey: "coolFeatureEnabled") } 
} 

ответ

1

Вот как избежать строковые литералы с #function в Swift 3

// a little bit of setup 

private func getBool(key: String = #function) -> Bool { 
    return UserDefaults.standard.bool(forKey: key) 
} 

private func setBool(_ newValue: Bool, key: String = #function) { 
    UserDefaults.standard.set(newValue, forKey: key) 
} 


// and here is the fun part 

var coolFeatureEnabled: Bool { 
    get { return getBool() } 
    set { setBool(newValue) } 
} 

var anotherFeatureEnabled: Bool { 
    get { return getBool() } 
    set { setBool(newValue) } 
} 

... 
+0

@dan проверить это, вы будете удивлены ;-) –

+0

@dan уверены, что вы используете Swift 3 ? параметр '# function' по умолчанию расширяет имя функции, которое является либо« coolFeatureEnabled », либо« anotherFeatureEnabled ». вы можете легко проверить его, вставив 'print (key);' to setter или getter –

+1

@dan Это действительно сработает, как при использовании в качестве параметра по умолчанию '# function' [принимает имя объявления, в котором функция (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID389) - в этом примере это займет имя "coolFeatureEnabled" или "anotherFeatureEnabled". – Hamish

Смежные вопросы