将地图与拆分相结合

时间:2017-11-07 03:57:01

标签: swift string swift3 casting

从拥有以下字符串开始:12#17#15我希望得到一个包含数字的数组:[12, 17, 15]

我尝试了以下方法,但首先我仍然遇到错误(Cannot convert value of type '[Double?]' to expected argument type 'Double?'),显然,我更喜欢在一张地图而不是这样的链上完成所有操作。为什么这些类型不同..?我会说他们应该匹配...

let substrings = records?.split(separator: "#", maxSplits: Int.max, omittingEmptySubsequences: true).map(String.init).map(Double.init)
let objects = substrings.map {value in Model(value: value ?? 0)}

2 个答案:

答案 0 :(得分:2)

除非有一些我从未听说过的技巧,否则你没有正确使用map

以下是您想要的代码示例:

let string = "12#17#15"
let objects = string.split(separator: "#").map {Double($0) ?? 0}
在Swift中,map对数组的每个条目执行某些操作,然后产生某种输出。这里发生的事情是,首先只做一个简单的拆分(我假设您实际上并不需要Int的上限来获得最大结果,但您可以重新添加如果你愿意的话,然后用每个子字符串(用Double调用)启动$0。如果尝试创建Double失败,那么我会将其合并为0而不是nil

如果您不希望Double失败并返回nil为零,那么请改用flatmap {$0}

答案 1 :(得分:1)

我会使用flatMap而不是map,因为带字符串的Double init可以返回可选项。

let records = "12#17#15"
let substrings = records.split(separator: "#").flatMap {Double($0)}
print(substrings) // [12.0, 17.0, 15.0]