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 不适合 UInt32
。 UInt64
在这里是更好的选择。
看起来 OP 只是想让旧的 Swift 2.2 代码在 Swift 3.0 上运行良好 :) 不幸的是,有时这是不可能的。
@StuartP。这就说得通了。请参阅我的更新答案。
实际上,我认为这没有帮助。 graphPoints
和 firstPriceInGraph
存在问题:它们的类型错误
【参考方案1】:
正如你所说,这是其他Array
s 中的Array
。 [[UInt32:Int]]()
会创建一个 Dictionary
s 的 Array
,因为 [UInt32:Int]
是 Dictionary
,其中 UInt32
作为键,Int
作为值。
Swift 数组只包含一种类型的元素,因此您可以将 [[Integer]]
、Integer
作为 UInt32
和 Int
都符合的协议。然后,在访问时,如果您希望它们在这些类型中,则必须显式转换为 UInt32
或 Int
。
然后,您还可以将 [[Integer]]
转换为 [(UInt32, Int)]
、包含 UInt32
和 Int
的元组的 Array
。
【讨论】:
【参考方案2】:我现在正尝试转换为 Swift 3 并使用
[[UInt32:Int]]()
指定我有一个数组,其中包含其他数组,这些数组具有 32 个无符号整数以及之后的整数。
这根本不是那个意思。 [[UInt32: Int]]()
是:Array<Dictionary<UInt32, Int>>.init()
的简写
拥有 2 种类型的数组(例如 UInt32
和 Int
)的唯一方法是让数组存储这两种类型的超类型。在这种情况下,UInt32
和Int
都遵循Integer
协议,因此您可以将UInt32
和Int
都存储在Array<Integer>
中。不过这很恶心,因为它需要你不断地从Integer
显式向下转换为UInt32
或Int
。这引入的间接性也有性能成本。
实现类似事情的更好方法是存储 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 及以前版本中工作的主要内容,如果未能解决你的问题,请参考以下文章