Swift 将数组数组映射到元组数组 - 'map' 产生 [T],而不是预期的
Posted
技术标签:
【中文标题】Swift 将数组数组映射到元组数组 - \'map\' 产生 [T],而不是预期的【英文标题】:Swift map array of arrays to array of tuples - 'map' produces [T], not the expectedSwift 将数组数组映射到元组数组 - 'map' 产生 [T],而不是预期的 【发布时间】:2017-07-18 16:09:45 【问题描述】:我确定我在这里做了一些愚蠢的事情,但不明白是什么。
目标是将数组数组(在 json 中为:[[0.1, 0.2, "Text"], ...]
)映射到 CGPoint/String 对的元组数组:[CGPoint(0.1, 0.2), "Text"]
我有一个看起来像这样的容器类:
struct Foo
let text: [(CGPoint, String)]
init(json: [String: Any]) throws
let textraw = (json["text"] ?? []) as! [[Any]]
text = textraw.map // <- Error here
(a) -> (CGPoint, String) in
return (CGPoint(a[0] as! CGFloat, a[1] as! CGFloat), a[2] as! String)
错误信息是:
'map' 产生 '[T]',而不是预期的上下文结果类型 '[(CGPoint, String)]'
我不明白为什么 swift 无法确定块在这里返回正确的类型?
【问题讨论】:
【参考方案1】:您没有说明您使用的是哪个版本的 Swift,但您的代码在 Swift 3 和 4 上看起来不错,只是您缺少 CGPoint 初始化程序的参数标签:
return (CGPoint(x: a[0] as! CGFloat, y: a[1] as! CGFloat), a[2] as! String)
【讨论】:
【参考方案2】:好的,我解决了,这里的错误信息真的很不幸。
我设法忘记了 CGPoint 构造函数的工作原理 - CGPoint(x:, y:)
而不是 CGPoint(,)
。这是真正的错误。修复相关行阅读:
return (CGPoint(x: a[0] as! CGFloat, y: a[1] as! CGFloat), a[2] as! String)
解决了问题。
【讨论】:
以上是关于Swift 将数组数组映射到元组数组 - 'map' 产生 [T],而不是预期的的主要内容,如果未能解决你的问题,请参考以下文章