Развертывание необязательно в Swift 4 - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть следующий код на детской площадке:

// Create an empty array of optional integers
var someOptionalInts = [Int?]()

// Create a function squaredSums3 with one argument, i.e. an Array of optional Ints
func squaredSums3(_ someOptionalInts: Int?...)->Int {
    // Create a variable to store the result
    var result = 0

    // Get both the index and the value (at the index) by enumerating through each element in the someOptionalInts array
    for (index, element) in someOptionalInts.enumerated() {
        // If the index of the array modulo 2 is not equal to 0, then square the element at that index and add to result
        if index % 2 != 0 {
            result += element * element
        }
    }

    // Return the result
    return result
}

// Test the code
squaredSums3(1,2,3,nil)

Строка результата + = элемент * элемент выдает следующую ошибку "Значение необязательного типа 'Int?' не развернутый, ты хотел использовать '!' или же '?'?" Я не хочу использовать '!' и я должен проверить на нулевой случай. Я не уверен, где (или даже, если честно) развернуть опционально. Предложения?

Ответы [ 4 ]

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

Вот как бы я это написал:

for (index, element) in someOptionalInts.enumerated() {
    guard let element = element, index % 2 == 0 else { continue }
    result += element * element
}
// result == 10

Заявление guard означает, что меня интересует только когда element не nil и , его index четное.

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

Ошибка появляется, потому что вы должны указать, что делать, если элемент nil

if index % 2 != 0 {
    if let element = element {
        result += element * element
    }
    else {
        // do whatever you want
    }
}
0 голосов
/ 04 сентября 2018

Все, что вам нужно сделать, это развернуть необязательное:

if let element = element, index % 2 != 0 {
    result += element * element
}

Это будет игнорировать нулевые значения.

Преимущество этого по сравнению с любым отображением заключается в том, что вам не нужно обходить массив в дополнительное время.

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

Если вы хотите пропустить значения nil из массива, вы можете сжать это:

for (index, element) in (someOptionalInts.compactMap { $0 }).enumerated() {

Тогда element больше не будет обязательным.


Если вместо этого вы хотите обработать все nil значения как 0, то вы можете сделать:

if index % 2 != 0 {
    result += (element ?? 0) * (element ?? 0)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...