我有一系列自定义对象。为简单起见,我们假设每个对象都有3个属性:id
,timestamp
和text
。我现在从我的服务器获取一个JSON响应,其中包含数组中对象的更新text
。我需要做以下事情:
id
的对象。 text
设置为更新的text
,而不更改其任何其他属性。 我找到了以下扩展,它允许我在我的数组中找到对象。
extension CollectionType {
func find(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element? {
return try indexOf(predicate).map({self[$0]})
}
}
然后我使用以下逻辑从数组中获取项目。
let my_object = questionImageObjects.find({$0.id== myId})
现在我使用my_object.text = currText
设置文本。
最后一步是使用更新的对象覆盖数组中的旧对象。这是我被困的地方。
答案 0 :(得分:1)
扩展程序find
将返回原始结构的副本。无论你做什么,原来都不会受到影响。您可以通过索引修改它:
struct DataModel: CustomStringConvertible {
var id: Int
var timestamp: NSDate
var text: String
init(id: Int, timestamp: NSDate, text: String) {
self.id = id
self.timestamp = timestamp
self.text = text
}
// For debug purposes
var description: String {
get { return "( id = \(id), timestamp = \(timestamp), text = \(text) )" }
}
}
// Initial data
var arr = [
DataModel(id: 1, timestamp: NSDate(), text: "Anakin Skywalker"),
DataModel(id: 2, timestamp: NSDate(), text: "Luke Skywalker")
]
// Now the server returns a JSON that says Anakin has turned to the Dark Side
let jsonString = "{ \"id\": 1, \"text\": \"Darth Vader\" }"
let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
let json = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
// Update the text
if let dict = json as? [String: AnyObject],
let id = dict["id"] as? Int,
let newText = dict["text"] as? String,
let index = (arr.indexOf { $0.id == id }) {
arr[index].text = newText
}
print(arr)
如果这些if let
让您感到困惑,请按以下步骤进行操作:
if let dict
检查JSON是否可以转换为字典let id
检查其id
类型为Int
let newText
检查其text
类型为String
let index
检查数组是否包含具有id