5

我正在尝试根据使用 swift 库(https://github.com/ankurp/Dollar)的 方法从数组(称为 )中提取变量( 等),safety_rating_id以便以后可以发出 POST 请求(最终,我希望能够用提取的数组变量替换参数中的硬编码值),但我的结果全部返回 nil。scorearraysubmission_idDollarfindfind

这些是我想要的内部数组,其中submission_id来自27该数组https://codeshare.io/zr1pw(第 22-36 行):

{
 "submission_id" : "27",
 "name" : "Equipment",
 "task_id" : "37",
 "points" : "10",
 "safety_rating_id" : 105,
 "score" : "9"
}, {
 "submission_id" : "27",
 "name" : "Emergency Equipment",
 "task_id" : "37",
 "points" : "10",
 "safety_rating_id" : 106,
"score" : "9"
}

代码:

  var array: [JSON] = []   
  func submitScore(onCompletion: () -> (), onError: ((NSError) -> ())? = nil) {

    guard let endPoint = Data.sharedInstance.submitScoreEndpoint
        else { print("Empty endpoint"); return }

    let user = Users()

    let test = $.find(self.array, callback: { $0 == 27 })
    print(test)

    let Auth_header = [
        "Authorization" : user.token,
        ]

    let parameters: [String:Array<[String:Int]>] = [
        "ratings" : [
            [
                "safety_rating_id" : 105,
                "schedule_job_id" : 18,
                "score" : 9,
                "submission_id" : 27
            ],
            [
                "safety_rating_id" : 106,
                "schedule_job_id" : 18,
                "score" : 10,
                "submission_id" : 27
            ]
        ]
    ]


Alamofire.request(.POST, endPoint, headers: Auth_header, parameters: parameters, encoding: .JSON)
        .validate()
        .responseJSON {
        response in

        switch response.result {
        case .Success(let data):
            let json = JSON(data)
            print(json)
            onCompletion()
        case .Failure(let error):
            print("Request failed with error: \(error)")
            onError?(error)
        }

    }

}

更新

我能够获得具有submission_id27 的数组,但我想从两个数组中删除name并添加一个我从其他地方获得的数组task_idsubmission_id : 27schedule_job_id

我尝试使用for in循环从我想要的变量创建我自己的数组,但我一直在nil崩溃。这是新数组的样子https://codeshare.io/3VJSo

for循环错误

最终我想做一个"ratings" : [chosenArray]

4

3 回答 3

3

因此,在回调内部传递的是数组中的每个元素,因此您将获得字典对象。所以如果你想在数组中找到一个特定的项目,你应该这样做

let test = $.find(array) { $0["submission_id"]! == "27" }

如果您想要数组中提交 id 为 27 的所有元素,请使用filter

let test = array.filter { $0["submission_id"]! == "27" }

要从字典对象中删除属性,您需要对removeValueForKey数组中的每个项目调用方法。

let jsonWithMySubmissionId = self.array.filter ({ $0["submission_id"]! == 27 })
for json in jsonWithMySubmissionId {
  json.removeValueForKey("name")
  json.removeValueForKey("task_id")
  ...
}
于 2016-06-06T21:50:53.997 回答
2

我认为您使用$错误。当您调用包含 JSON 对象$.findself.array数组时,不确定该对象究竟是什么,但我假设它是 Dictionary。所以我认为你应该这样做:

let jsonWithMySubmissionId = self.array.filter ({ $0["submission_id"]! == 27 }).first

然后,我会避免对字典进行强制解包。只是为了让您在一行代码中理解我的观点。

编辑:

然后你可以遍历数组并像这样提取你的字段:

let jsonWithMySubmissionId = self.array.filter ({ $0["submission_id"]! == 27 })
for json in jsonWithMySubmissionId {
  json["name"] = nil
  json["task_id"] = nil
  ...
}
于 2016-06-02T17:22:31.363 回答
2

dic在你的 for 循环中必须是NSMutableDictionary. 因为你无法操纵NSDictionary.

第二件事没有像removeValueForKey.

您应该使用removeObjectForKeyremoveObjectsForKeys

removeObjectsForKeys你必须传递参数数组(键作为参数)。

removeObjectForKey您可以传递一个字符串(键)作为参数。

于 2016-06-08T12:23:57.670 回答