Swift. Лучший способ получить Int от Int? - PullRequest
0 голосов
/ 02 ноября 2018

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

let arrayOptional : [Int?] = [25, 30, nil, 50, nil]
// Optional Binding
var sum = 0
for i in arrayOptional {
    if let temp = i {
        sum += temp
    }
}
sum = 0

// Forced Unwrapping
for i in arrayOptional {
    if i != nil {
        sum += i!
    }
}
sum = 0

// ?? operator
for i in arrayOptional {
    sum += i ?? 0
}

Так есть ли преимущества использования одного метода над другим?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Вы можете просто использовать reduce, чтобы получить сумму.

let sum = arrayOptional.reduce(into: 0, {$0 += $1 ?? 0})

Как правило, вы должны использовать необязательную привязку (ваш первый подход) или оператор объединения нулей (ваш последний подход) для безопасного развертывания необязательных параметров, проверки нулей и последующего принудительного развертывания не рекомендуется.

Если вы хотите придерживаться циклического подхода, вы можете упростить его, используя сопоставление с образцом в объявлении переменной цикла (тело цикла будет выполняться только для ненулевых значений в arrayOptional):

var sum = 0
for case let i? in arrayOptional {
    sum += i
}
0 голосов
/ 02 ноября 2018

Что вы можете сделать, это использовать функцию compactMap, поэтому вы получите ненулевые значения из arrayOptional, а затем используйте функцию reduce для получения результата

sum = arrayOptional.compactMap{ $0 }.reduce(0, +)
0 голосов
/ 02 ноября 2018

Вы разворачиваете его, используя if let или guard... else.

//If let would be optimal for your example because you are not doing much after unwrapping 
for i in arrayOptional {
    if let temp = i {
        sum += temp
    }
}

// guard...else would be useful when you have a lot to do and you don't want to keep on nesting code inside {}
for i in arrayOptional {
    guard let temp = i else {
        continue
    }
    sum += temp
}

Принудительное развертывание (!) выполняется только в том случае, если вы хотите, чтобы приложение аварийно завершилось, или если вы уверены, что дополнительный файл не будет содержать nil. Например: удаление из ячейки свойства UITextfield и UITextView text является необязательным, но никогда не будет nil.

.

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

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