gpt4 book ai didi

swift - 将 "generic"对象图(字典、数组、字符串等)保存为默认值而不进行编码?

转载 作者:行者123 更新时间:2023-11-28 08:16:35 24 4
gpt4 key购买 nike

通用对象根可以本地保存为默认值吗?我知道自定义对象需要编码,但我希望编写图表以便可以通过 plist 编辑器对其进行操作。在我的例子中,我的“对象”是一组“通用”类型的字典。

这就是我要放弃的(播放列表模型)

class PlayItem : NSObject,NSCoding {
var name : String = "item"
var link : NSURL = NSURL.init(string: "http://")!
var rank = 0

override init() {
name = "item"
link = NSURL.init(string: "http://")!
super.init()
}
init(name:String, link:NSURL, rank:Int) {
self.name = name
self.link = link
self.rank = rank
super.init()
}
required init(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey("name") as! String
self.link = aDecoder.decodeObjectForKey("link") as! NSURL
self.rank = aDecoder.decodeObjectForKey("rank") as! Int
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(name, forKey: "name")
aCoder.encodeObject(link, forKey: "link")
aCoder.encodeObject(rank, forKey: "rank")
}
}

class PlayList: NSObject {
var name : String = "list"
var list : Array <PlayItem> = Array()

override init() {
name = "list"
list = Array <PlayItem> ()
super.init()
}

init(name:String, list:Array <PlayItem>) {
self.name = name
self.list = list
super.init()
}
required init(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey("name") as! String
self.list = aDecoder.decodeObjectForKey("link") as! Array
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(name, forKey: "name")
aCoder.encodeObject(list, forKey: "list")
}
}

所以我会使用 ditch PlayList 和 PlayItem 自定义对象并使用 Array、Dictionary、String 等来表示能够保存这样的东西 enter image description here

根将是我的“播放列表”数组。我是否正确,我可以将整个播放列表数组保存/读取为

NSUserDefaults.standardUserDefaults().setObject(playlists, forKey: "playlists")
playlists = NSUserDefaults.standardUserDefaults().arrayForKey: "playlists")

最佳答案

所以这是我的解决方案 - 在内部保留自定义对象但发布通用对象。这里我们有一个数组 Controller 和每个播放列表和播放项的 TableView - 它的 Controller 绑定(bind)到“列表”的播放列表 Controller 选择,以及一个中央播放列表数组对象。

struct k {
static let play = "play"
static let item = "item"
static let name = "name"
static let list = "list"
static let link = "link"
static let rank = "rank"
}

// cache playlists read and saved to defaults
var defaults = NSUserDefaults.standardUserDefaults()
var playlists = [PlayList]()
var playCache = [PlayList]()

override func viewDidLoad() {
self.restorePlaylists(restoreButton)
}

override func viewWillAppear() {
// cache our list before editing
playCache = playlists
}

@IBOutlet weak var restoreButton: NSButton!
@IBAction func restorePlaylists(sender: NSButton) {
if let playArray = defaults.arrayForKey(UserSetting.Playlists.userDefaultsKey) {

playlistArrayController.removeObjects(playlistArrayController.arrangedObjects as! [AnyObject])
for playlist in playArray {
let play = playlist as! Dictionary<String,AnyObject>
let items = play[k.list] as! [Dictionary <String,AnyObject>]
var list : [PlayItem] = [PlayItem]()
for playitem in items {
let item = playitem as Dictionary <String,AnyObject>
let name = item[k.name] as! String
let path = item[k.link] as! String
let link = NSURL.init(string: path)
let rank = item[k.rank] as! Int
let temp = PlayItem(name:name, link:link!, rank:rank)
list.append(temp)
}
let name = play[k.name] as! String
let temp = PlayList(name: name, list: list)
playlistArrayController.addObject(temp)
}
dispatch_async(dispatch_get_main_queue()) {
self.playlistTableView.reloadData()
}
}
}

@IBOutlet weak var saveButton: NSButton!
@IBAction func savePlaylists(sender: AnyObject) {
let playArray = playlistArrayController.arrangedObjects as! [PlayList]
var temp = Array<AnyObject>()
for playlist in playArray {
var list = Array<AnyObject>()
for playitem in playlist.list {
let item : [String:AnyObject] = [k.name:playitem.name, k.link:playitem.link.absoluteString, k.rank:playitem.rank]
list.append(item)
}
temp.append([k.name:playlist.name, k.list:list])
}
defaults.setObject(temp, forKey: UserSetting.Playlists.userDefaultsKey)
defaults.synchronize()
}

在我看来,您需要在保存或恢复时明确解开每个值。工作表用于通过 dismissController 操作进行编辑,当取消时,将简单地使用 playCache 恢复播放列表数组 - 最初在编辑之前捕获。播放列表由用户操作明确保存或恢复。

关于swift - 将 "generic"对象图(字典、数组、字符串等)保存为默认值而不进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428798/

24 4 0
文章推荐: html - 如何将导航