从拥有以下字符串开始: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)}
答案 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]