如何使用 updateValue 在 Swift 中添加对象

how to use updateValue to add an object in Swift

我有一个要转换为 Json 的用户结构,以便能够进入 NSUserDefaults...

import Foundation

struct User {
    var name = ""
    var stores: [Store] = []

    init?(json: [String: AnyObject]) {
        if let name = json["name"] as? String,
            storesJSON = json["stores"] as? [[String: AnyObject]]
        {
            self.name = name
            self.stores = storesJSON.map { Store(json: [=11=])! }
        } else {
            return nil
        }
    }

    init() { }

    func toJSON() -> [String: AnyObject] {
        return [
            "name": name,
            "stores": stores.map { [=11=].toJSON() }
        ]
    }

}

我正在使用数据管理器 class(单例)添加新用户。但是我不知道要在下面的 addPerson 函数中将什么传递给 updateValue?或者还有另一种方法可以将此对象放入 NSUserDefaults 中吗?

import Foundation

class DataManager {

    static let sharedInstance = DataManager()

    var users = [String : User]()

    init() {
        let userDefaults = NSUserDefaults.standardUserDefaults()

        if let var userFromDefaults = userDefaults.objectForKey("users") as? [String : User] {

            users = userFromDefaults

        }

        else {
            // add default values later

        }


    }

 var userList: [String] {
        var list: [String] = []
        for userName in users.keys {
            list.append(userName)
        }
        list.sort(<)
        return list
    }

 func addPerson(newUserName: String) {
        users.updateValue(User(), forKey: newUserName)
 //       saveData()
    }

我想您已经知道如何创建 User 对象。这就是您应该作为参数传递给后续函数的内容。像这样的东西。

var aUser = User(["name": textField.text. capitalizedString])
DataManager.sharedInstance.addPerson(aUser)
    func addPerson(newUser: User) {
           users[newUser.name] = newUser
    // saveData()
        }

您应该更改 addPerson 函数的界面,使用 addPerson(newUser: User) 而不是 @iosDev82 所说的 addPerson(newUserName: String)

// Because your addPerson function needs two parameters: a name and a user object
func addPerson(newUser: User) {
    users.updateValue(newUser, forKey: newUser.name)
 //       saveData()
}

所以你可以:

let newName = textField.text.capitalizedString
let newUser = User(["name": newName, "stores" : []])

DataManager.sharedInstance.addPerson(newUser)