在代码中。
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())
.
我不明白到底是在哪里发生的包装:据我所知 map
不 joined
返回一个Optional--那么Swift把它包在哪里了?
这给我带来了麻烦,因为当我输入一个太大的列表时--比如说40个元素--Optional会持有 nil
而不是它应该保持的值。我也不知道为什么它将会保持 nil
.
正如@Joakim在评论中所说的那样。Int
初始化使用一个 String
参数是失败的,可能返回 nil
. 你可以通过提供一个默认值或使用 if let
或 guard 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}
}
这是一个不做任何中间转换的版本,它可能会大于: 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]