Swift 3 多维数组,在 Swift 2.2 及以前版本中工作

Posted

技术标签:

【中文标题】Swift 3 多维数组,在 Swift 2.2 及以前版本中工作【英文标题】:Swift 3 Multi-Dimension Array, Worked in Swift 2.2 and previous 【发布时间】:2016-10-04 17:27:05 【问题描述】:

我已经绞尽脑汁好几个小时了,感觉我已经尝试了大多数事情,所以我转向值得信赖的 Stack Overflow!

我有一个来自服务器的数组,这些数组与 unix 时间戳和一个如下所示的值相关:

[[1475511843000,183649999],[1475512143000,183612691],[1475512443000,183503638]]

我曾经简单地将这个变量设置为 var graphpoints:NSArray = []

我现在正在尝试转换为 Swift3 并使用 [[UInt32:Int]]() 指定我有一个包含其他数组的数组,这些数组具有 32 个无符号整数以及之后的整数。无论我尝试了哪种方式,包括标准语法和含糖语法:

[Int:[UInt32:Int]]()

[[UInt32:Int]]()

[[]]()

由于输入问题,允许我访问第二个数组,通常会给出类似于 Type 'Int?' has no subscript members 的错误。

在我对如何格式化数据有发言权之前,数据就是这种格式,所以我无法调整它,任何帮助将不胜感激。

服务器调用如下所示: `Alamofire.request(urlString).responseJSON 响应 切换响应。结果 案例.成功(让数据): 让 json = JSON(数据);

            //print("GRAPH DATA POINTS JSON: \(json)")

            //some graphs don't contain data so we have to test for null
            if !json.isEmpty 
                self.graphPoints = json["data"].arrayObject! as! [(timestamp: UInt64, value: Int)]
                if self.graphPoints.count > 0 
                    self.firstPriceInGraph = self.graphPoints[0][0].doubleValue
                    self.setupPercentageLabel()
                 else 
                    //no graph data available, hide something?
                    self.firstPriceInGraph = -1.0
                    if Helper.__DEBUG  print("NO DATA IN JSON... 1")
                
             else 
                //no graph data available, hide something?
                self.firstPriceInGraph = -1.0
                if Helper.__DEBUG print("NO DATA IN JSON... 2")
            

            self.graphView.reloadData()

        case .failure(let error):
            self.graphPoints = [(timestamp:UInt64, value:Int)]()
            self.graphView.reloadData()
            print("Get Graph Data - Request failed with error: \(error)")
        
    `

When trying Andrey Gordeev's answer

【问题讨论】:

你有数组数组,在前两个声明中你告诉它是字典数组尝试一次[[UInt32]] @NiravD 1475511843000 不适合 UInt32UInt64 在这里是更好的选择。 看起来 OP 只是想让旧的 Swift 2.2 代码在 Swift 3.0 上运行良好 :) 不幸的是,有时这是不可能的。 @StuartP。这就说得通了。请参阅我的更新答案。 实际上,我认为这没有帮助。 graphPointsfirstPriceInGraph 存在问题:它们的类型错误 【参考方案1】:

正如你所说,这是其他Arrays 中的Array[[UInt32:Int]]() 会创建一个 Dictionarys 的 Array,因为 [UInt32:Int]Dictionary,其中 UInt32 作为键,Int 作为值。

Swift 数组只包含一种类型的元素,因此您可以将 [[Integer]]Integer 作为 UInt32Int 都符合的协议。然后,在访问时,如果您希望它们在这些类型中,则必须显式转换为 UInt32Int

然后,您还可以将 [[Integer]] 转换为 [(UInt32, Int)]、包含 UInt32Int 的元组的 Array

【讨论】:

【参考方案2】:

我现在正尝试转换为 Swift 3 并使用 [[UInt32:Int]]() 指定我有一个数组,其中包含其他数组,这些数组具有 32 个无符号整数以及之后的整数。

这根本不是那个意思。 [[UInt32: Int]]() 是:Array<Dictionary<UInt32, Int>>.init() 的简写

拥有 2 种类型的数组(例如 UInt32Int)的唯一方法是让数组存储这两种类型的超类型。在这种情况下,UInt32Int 都遵循Integer 协议,因此您可以将UInt32Int 都存储在Array<Integer> 中。不过这很恶心,因为它需要你不断地从Integer 显式向下转换为UInt32Int。这引入的间接性也有性能成本。

实现类似事情的更好方法是存储 UInt32 和 Int 的元组:

let graphPoints: [(UInt32, Int)] = [
    (1475511843000, 183649999),
    (1475512143000, 183612691),
    (1475512443000, 183503638)
]

但是,这甚至行不通,因为1475511843000 太大而无法在UInt32 中采场,其最大值为4294967295 (UInt32.max)。

【讨论】:

【参考方案3】:

你写的是字典,不是多维数组。

[[UInt32:Int]]()

创建一个字典数组,其中 UInt32 作为键,Int 作为值。

[Int:[UInt32:Int]]()

创建一个使用 Int 作为键和另一个字典类型作为值的字典。

以上两个都不是你想要的。

由于您的数据是 UInt32 - Int 对,因此您可能不应该使用多维数组来存储它们,因为数组只能存储一种类型的值。

我的建议是使用元组数组:

[(UInt32, Int)]

示例用法:

theArray[3].0 // get the timestamp of the fourth item
theArray[7].1 // get the Int value of the eighth item

或者,试试字典:

[UInt32: Int]

请注意,这会使数据无序。您只能使用键访问值。

【讨论】:

这似乎导致Cannot subscript a value of type 'inout [(timestamp: UInt64, value: Int)]' (aka 'inout Array<(timestamp: UInt64, value: Int)>') 尝试像let timestamp = self.graphPoints[0].timestamp 那样访问数据时 @StuartP。我似乎无法重现这一点。您可以编辑您的问题以显示更多代码吗?【参考方案4】:

这个怎么样:

let array = [[UInt64]]() 

let array: [[UInt64]] = [[1475511843000,183649999],[1475512143000,183612691],[1475512443000,183503638]]

您试图通过[Int:[UInt32:Int]]()[[UInt32:Int]]() 定义的不是数组数组。第一个是字典,其中 value 是另一个字典。第二个是字典数组。

PS:正如 Alexander Momchilov 所说,最好将您的数据包装到 [(UInt64, Int)]

【讨论】:

Type 'UInt64' has no subscript members 是结果,但我会尝试包装数据,那么从其中提取数据的最佳方法是什么,因为我想它不会通过 [0][0]例如。另外我相信数据类型现在需要成为其中的一部分,所以也许[(timestamp:UInt64, value:Int)] Type 'UInt64' has no subscript members 是什么结果? Of let array = [[UInt64]]() 当我尝试通过 let value = self.graphPoints[0][0] 访问它时 @StuartP。 self.graphPoints 的类型是什么?您是否将NSArray 替换为[[UInt64]]let value = array[0][0] 对我来说很好用。返回1475511843000

以上是关于Swift 3 多维数组,在 Swift 2.2 及以前版本中工作的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中通过计数从多维数组中找到最大的数组

Swift、SpriteKit 和带有 CGPoint 的多维数组

Swift 2:使用多维对象写入 plist

Swift - 多维数组排序

iOS Swift:将数组排序为多维数组

在 Swift 5.1 中循环遍历多维/嵌套 JSON 数据