Кастинг Любой? Int, String или Bool - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть функция в Swift, которая возвращает Any? значение, и я хотел бы привести результат (в зависимости от типа значения) в Bool, String или Int.

Эта функция:

static func value(forKey: SettingKeys) -> Any? {
    return settingManager.settings.filter({$0.key == forKey.rawValue}).first?.value
}

и затем, когда я делаю:

let printingEnabled = AppSettings().value(forKey:"printingEnabled") as? Int

я получаю ноль. Без приведения значение необязательно («1»). Похоже, когда я пытаюсь привести результаты к String или Int. Любая идея о том, как я могу привести результат к типу по своему выбору?

Спасибо.

1 Ответ

0 голосов
/ 07 сентября 2018

Вы не хотите, чтобы функция возвращала 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, поэтому мой код, вероятно, значительно отличается от вашего. )

...