覆盖数组swift ios中的旧对象

时间:2016-06-20 23:20:21

标签: ios arrays swift find

我有一系列自定义对象。为简单起见,我们假设每个对象都有3个属性:idtimestamptext。我现在从我的服务器获取一个JSON响应,其中包含数组中对象的更新text。我需要做以下事情:

  1. 从我的数组中获取给定id的对象。
  2. 将对象的text设置为更新的text,而不更改其任何其他属性。
  3. 使用新的和更新的对象覆盖旧对象。
  4. 我找到了以下扩展,它允许我在我的数组中找到对象。

     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设置文本。

    最后一步是使用更新的对象覆盖数组中的旧对象。这是我被困的地方。

1 个答案:

答案 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
  • 的元素