将2个字典分组到Swift中数组中的一个数组

时间:2018-07-24 06:17:10

标签: ios arrays iphone swift

当我的数字数组像-> ["1","2","3","4","5","6","7"]

let numbers = ["1","2","3","4","5","6","7"]
let chunkSize = 2
let chunks = stride(from: 0, to: numbers.count, by: chunkSize).map {
    Array(numbers[$0..<min($0 + chunkSize, numbers.count)])
}

// prints as [["1", "2"], ["3", "4"], ["5", "6"], ["7"]]

但是当我的数字数组像

   (
        {
        "facility_id" = 1;
        "options_id" = 3;
    },
        {
        "facility_id" = 3;
        "options_id" = 12;
    },
        {
        "facility_id" = 2;
        "options_id" = 7;
    },
        {
        "facility_id" = 3;
        "options_id" = 12;
    },
        {
        "facility_id" = 2;
        "options_id" = 6;
    },
        {
        "facility_id" = 1;
        "options_id" = 4;
    }
  ) 

正在显示此错误:

  

无法将“ CountableRange”类型的值转换为预期的参数类型“ Int”

3 个答案:

答案 0 :(得分:1)

如果这段代码

  

[{'id':1},{'id':2},{'id':3},{'id':4},{'id':5},{'id':6},{'id':7}]

Dictionary,那么您的策略应类似于:

  1. 将所有值放入一个简单的数组中
  2. 像以前一样大步使用价值。

示例:

let dict = [["id": 1], ["id": 2], ["id": 3], ["id": 4]]
let numbers = dict.flatMap { $0.values } // [1, 2, 3, 4]
let chunkSize = 2
let chunks = stride(from: 0, to: numbers.count, by: chunkSize).map {
    Array(numbers[$0..<min($0 + chunkSize, numbers.count)])
}
print(chunks) // [[1, 2], [3, 4]]

UPD。

我看到numbers是相同的变量,但是它可以包含不同的值。在这种情况下,您可以检查numbers的类型,然后使用适当的方式进行分组。

var values: [Int] = []

if let numbers = numbers as? [String] {
    values = numbers.map { Int($0) }
} else if let numbers = numbers as? [[String, Int]] {
    values = numbers.compactMap { $0["id"] }
}

然后在values上大步前进:

let chunkSize = 2
let chunks = stride(from: 0, to: numbers.count, by: chunkSize).map {
    Array(values[$0..<min($0 + chunkSize, numbers.count)])
}
print(chunks) // [[1, 2], [3, 4]]

请注意,numbers应该是快速的Array,而不是NSMutableArray,因为NSMutableArray不能通过使用CountableRange进行下标。

答案 1 :(得分:1)

尝试以下解决方案:

let numbers = [["id":1],["id":2],["id":3],["id":4],["id":5],["id":6],["id":7]]//["1","2","3","4","5","6","7"]
let chunkSize = 2
let chunks = stride(from: 0, to: numbers.count, by: chunkSize).map  {
    Array(numbers[$0..<min($0 + chunkSize, numbers.count)])
}
print("chunks :: ", chunks)

//打印为[[["id": 1], ["id": 2]], [["id": 3], ["id": 4]], [["id": 5], ["id": 6]], [["id": 7]]]

如果只需要数字,请尝试以下代码:

let numbersDictArray = [["id":1],["id":2],["id":3],["id":4],["id":5],["id":6],["id":7]]
let numbers = numbersDictArray.flatMap { $0.values }
let chunkSize = 2
let chunks = stride(from: 0, to: numbers.count, by: chunkSize).map  {
     Array(numbers[$0..<min($0 + chunkSize, numbers.count)])
}
print("chunks :: ", chunks)

//打印为[[1, 2], [3, 4], [5, 6], [7]]

答案 2 :(得分:1)

您的代码看起来正确。问题出在您的输入数组上。根据您的评论之一

  

@adev-> var dataArray:NSMutableArray = NSMutableArray.init()–

您正在使用NSMutableArray,而不是快速的Array。 NSMutableArray不能使用CountableRange<Int>

下标
$0..<min($0 + chunkSize, numbers.count)  //returns CountableRange<Int>

您需要使用快速Array来完成这项工作