在Swift 4中展开可选

时间:2018-09-04 13:16:08

标签: swift optional swift-playground optional-values

我在操场上有以下代码:

// 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 :(得分:2)

您所要做的就是解开可选项:

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

这将忽略nil值。

与任何类型的映射相比,此方法的优点是您不必花费额外的时间遍历数组。

答案 1 :(得分:1)

如果您想从数组中忽略nil值,则可以紧凑地映射它:

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

然后,element不再是可选的。


如果您想将所有nil的值都视为0,则可以执行以下操作:

if index % 2 != 0 {
    result += (element ?? 0) * (element ?? 0)
}

答案 2 :(得分:0)

出现错误是因为您必须指定在元素为nil的情况下要做什么

if index % 2 != 0 {
    if let element = element {
        result += element * element
    }
    else {
        // do whatever you want
    }
}

答案 3 :(得分:0)

这是我的写法:

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

guard语句意味着我仅对element不是nil 并且其index是偶数的感兴趣。