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],而不是预期的的主要内容,如果未能解决你的问题,请参考以下文章

元组Tuple数组Array映射Map

Spark Dataframe:从 Map 类型生成元组数组

理解Swift中map 和 flatMap对集合的作用

理解Swift中map 和 flatMap对集合的作用

Swift将数组转换为元组数组

Swift高阶函数-MapFilterReduce