Быстрое преобразование необязательной строки в Int или Int32 (вопрос развертывания необязательных) - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь прочитать строку и преобразовать ее в int.У меня есть решение, но оно кажется слишком сложным.Я думаю, что я все еще пытаюсь обернуть голову вокруг распаковки.

Я разместил код ниже вместе с ошибками компилятора, которые я получаю с каждым решением.

В этом примере я пытаюсь прочитать строку из UserDefaults и преобразовать ее в целочисленное значение.

static func GetSelectedSessionNum() -> Int32 {
    var sessionNum : Int32 = 0
    let defaults = UserDefaults.standard

    let optionalString: String? = defaults.string(forKey: "selectedSessionNum")
    // this works but it's too complicated
    if let string = optionalString, let myInt = Int32(string) {
        return myInt
    }
    return 0

    // Error : optional String? must be unwrapped to a value of type 'String'
    let t : String = defaults.string(forKey: "selectedSessionNum")

    if let s : String = defaults.string(forKey: "selectedSessionNum") {
        // error - Int32? must be unwrapped to a value of Int32
        return Int32(s)
    }
    return 0
}

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Если вы хотите несложное решение, сохраните selectedSessionNum как Int

static func getSelectedSessionNum() -> Int32 {    
    return Int32(UserDefaults.standard.integer(forKey: "selectedSessionNum"))
}

в противном случае двойное необязательное связывание

if let string = UserDefaults.standard.string(forKey: "selectedSessionNum"), let myInt = Int32(string) {
    return myInt
}

или оператор слияния nil

if let string = UserDefaults.standard.string(forKey: "selectedSessionNum") {
    return Int32(string) ?? 0
}

- правильный путь

0 голосов
/ 22 января 2019

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

return UserDefaults.standard.string(forKey: "selectedSessionNum").flatMap(Int32.init) ?? 0

Вам также понадобится?? (оператор объединения nil) для покрытия сценариев, в которых либо происходит сбой инициализатора, либо значение отсутствует в пользовательских значениях по умолчанию.

0 голосов
/ 21 января 2019

Вам необходимо привести к non optional Int32, чтобы соответствовать вашему типу возврата.

Вы можете использовать любой необязательный метод привязки или изменить тип возврата на Int32?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...