iOS - 本地保存键值对数组

标签 ios swift nsobject nscoder

在我正在开发的应用程序中,用户需要添加“企业”才能使用该应用程序。但是,他们可以向应用程序添加多个“企业”。每个添加的企业都需要两件事:名称和企业 API key 。

我创建了一个“企业”类:

class Enterprise : NSObject {

    var name:String!
    var apiKey:String!

    init (name:String, apiKey:String) {
        self.name = name
        self.apiKey = apiKey
    }

    required init(coder decoder: NSCoder) {
        self.name = decoder.decodeObjectForKey("name") as String
        self.apiKey = decoder.decodeObjectForKey("apiKey") as String
        super.init()
    }

    func encodeWithCoder(coder: NSCoder) {
        coder.encodeObject(self.name, forKey: "name")
        coder.encodeObject(self.apiKey, forKey: "apiKey")
    }

}

关于这个类需要注意的一点是,在我按照构建这个类的示例中,他们将该类分类为 NSCoder 和 NSObject,但是如果我向该类添加“NSCoder”,我会收到以下错误:

Multiple inheritance from classes 'NSObject' and 'NSCoder'

保存数组时,我使用以下内容:

let name = self.enterpriseName.text
let key = self.apiKey.text
if name != "" {
    if key != "" {
        let defaults = NSUserDefaults.standardUserDefaults()
        let objectKey = "enterprise"
        var ent = [Enterprise(name: name, apiKey: key)]
        var entData = NSKeyedArchiver.archivedDataWithRootObject(ent)
        defaults.setObject(entData, forKey: objectKey)
        defaults.synchronize()
    }
    else {
        println("No API key")
    }
}
else {
    println("No name")
}

这似乎在存储一个值时有效,但是当我在启动时检查数组中有多少项时,它只显示 1。

有什么办法可以做到这一点吗?我正在寻找的最终结果类似于:

Enterprises:
    Enterprise
        name: abc
        apiKey: 184nfh692j6j31))8dx

    Enterprise
        name: def
        apiKey: 23oih9823tng893g2gd

    Enterprise:
        name: ghi
        apiKey: sfgYSS4yw44gw31!#%q

如果用户选择删除特定企业,则可以将其从列表中移除。

编辑

这是有效的方法,使用莱昂纳多的(下面,接受的答案)方法:

let name = self.enterpriseName.text
let apiKey = self.apiKey.text
if name != "" {
    if apiKey != "" {
        var enterprises = NSMutableDictionary()
        var loadedEnterprises = Load.dictionary("enterprises")
        if loadedEnterprises != nil {
            if(loadedEnterprises.count > 0) {
                for (key, value) in loadedEnterprises {
                    enterprises.setObject(value, forKey: key as String)
                }
            }
        }
        enterprises.setObject(apiKey, forKey: name)     
        Save.dictionary("enterprises", enterprises)
    }
    else {
        println("No API key")
    }
}
else {
    println("No name")
}

最佳答案

您应该使用字典,否则您最终可能会得到具有不同 key 的同一企业。我创建了一个类来将字典加载和保存到用户默认值。你应该这样做:

class Load {
    class func dictionary(key:String) -> NSDictionary! {
        return NSUserDefaults.standardUserDefaults().objectForKey(key) as? NSDictionary
    }
}

class Save {
    class func dictionary(key:String, _ value:NSDictionary) {
        NSUserDefaults.standardUserDefaults().setObject(value, forKey: key)
    }
}

class Remove {
    class func object(key:String) {
        NSUserDefaults.standardUserDefaults().removeObjectForKey(key)
    }
}


var enterprises:[String:String] = ["abc":"184nfh692j6j31))8dx","def":"23oih9823tng893g2gd","ghi":"sfgYSS4yw44gw31!#%q"]
Save.dictionary("enterprises", enterprises)

name = "jkl"
apiKey = "9a4giNifjKJq6v8G4fb"

if !name.isEmpty {
    if !apiKey.isEmpty {
        enterprises[name] = apiKey
        Save.dictionary("enterprises", enterprises)
    } else {
        println("No API key")
    }
} else {
    println("No name")
}

for (key, value) in enterprises {
    println("\(key)=\(value)")
}

let loadedDictionary = Load.dictionary("enterprises")

for (key, value) in loadedDictionary {
    println("\(key)=\(value)")
}

关于iOS - 本地保存键值对数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28481299/

相关文章:

ios - UICollectionView 布局在滚动时表现异常

ios - 将状态/绑定(bind)传递给 UIViewRepresentable

objective-c - 我的 Cocoa 应用程序如何收到 NSScreen 分辨率更改的通知?

objective-c - 如何测试 *void 指针是否指向 Objective C 中的 NSObject

exception - NSObject(NSObject)didNotRecognizeSelector崩溃的应用程序,报告缺少某些符号

ios - 如何快速访问 NSObject 中的元素?

ios - 由于 GTLRServiceCompletionHandler,无法为 Google Drive REST API 运行 service.executeQuery()

objective-c - iOS 中的键盘快捷键?

ios - 快速碰撞边界不起作用

ios - 如何延迟 Swift 中发生的事情?