我的Int在哪里变成了可选项?Swift 5.2

问题描述 投票:-1回答:1

在代码中。

func f(_ digits: [Int]) -> [Int]{
    let mapStr = digits.map{String($0)}
    let mapInt = String(Int(mapStr.joined()) + 1)

    return mapInt.compactMap{$0.wholeNumberValue}
}

编译器说我必须解开 Int(mapStr.joined()).

我不明白到底是在哪里发生的包装:据我所知 mapjoined 返回一个Optional--那么Swift把它包在哪里了?

这给我带来了麻烦,因为当我输入一个太大的列表时--比如说40个元素--Optional会持有 nil 而不是它应该保持的值。我也不知道为什么它将会保持 nil.

arrays swift optional
1个回答
0
投票

正如@Joakim在评论中所说的那样。Int 初始化使用一个 String 参数是失败的,可能返回 nil. 你可以通过提供一个默认值或使用 if letguard let 语法。这里是一个默认值的例子。

func f(_ digits: [Int]) -> [Int] {
    let mapStr = digits.map{String($0)}
    let mapInt = String(Int(mapStr.joined()) ?? 0 + 1)

    return mapInt.compactMap{$0.wholeNumberValue}
}

0
投票

这是一个不做任何中间转换的版本,它可能会大于: Int.max:

func f(_ digits: [Int]) -> [Int] {
    return digits
        .flatMap {
            String($0).map { Int(String($0))! }
        }
}

f([12,34,56]) // [1, 2, 3, 4, 5, 6]

© www.soinside.com 2019 - 2024. All rights reserved.