Вы не хотите, чтобы функция возвращала Any?
. Это кошмар типа. Вместо этого вы хотите использовать обобщенные значения, чтобы убедиться, что значение соответствует требуемому типу. Например:
static func value<T>(ofType: T.Type, forKey: SettingKeys) -> T? {
return settingManager.settings.filter({$0.key == forKey.rawValue}).first?.value as? T
}
Тогда это будет:
let printingEnabled = AppSettings().value(ofType: Int.self, forKey:"printingEnabled")
printingEnabled
в этом случае будет Int?
.
Вы также можете, конечно, обернуть это в помощников как:
static func int(forKey: SettingKeys) -> Int? {
return value(ofType: Int.self, forKey: forKey)
}
(Кстати, хотя вы определенно хотите избежать Any?
и использовать такой подход, я не могу воспроизвести вашу проблему. printingEnabled
для меня Int?
и, как и ожидалось, Optional(1)
. I Я не вижу ни одного случая, когда он nil
. Но я не могу сделать так, чтобы ваш код компилировался так, как написано, поскольку неясно, что такое SettingKeys
и settings
, поэтому мой код, вероятно, значительно отличается от вашего. )