Как я прочитал и опробовал :-) Я могу сохранить только некоторые простые типы данных в файлах pList. Тем не менее, я люблю использовать структуры, классы и т. Д. Для представления моих данных. Это должно быть как можно проще сохранено в файле pList и перезагружено.Swift: pList с «сложными» данными
Я вижу, что NSData является допустимым типом для pLists. А также, что это общий тип данных. Так что это хорошая идея для перемещения/преобразования/принудительного изменения структуры или класса в объект NSData для сохранения и перезагрузки? Как это будет сделано?
До сих пор я использую что-то вроде этого для сохранения:
let dict: NSMutableDictionary = ["XYZ": "XYZ"]
// saving values
dict.setObject(myBasicArray, forKey: "BasicArray")
dict.writeToFile(path, atomically: false)
Обновлено: Я использовал предложенный код и расширил его для обработки на структуру:
import Cocoa
struct SteeringItem {
var ext = String() // extension including dot e.g. ".JPG"
var bitmap = Int() // flag for grouping file types, e.g. photos
init?(ext: String, bitmap: Int) {
// Initialize stored properties.
self.ext = ext
self.bitmap = bitmap
}
}
class Foo {
let one: Int
let two: SteeringItem
init(one:Int, two: SteeringItem) {
self.one = one
self.two = two
}
init?(dict:[String: AnyObject]) {
guard let
one = dict["one"] as? Int,
two = dict["two"] as? SteeringItem else { return nil }
self.one = one
self.two = two
}
func toDictionary() -> [String: AnyObject] {
var retval = [String: AnyObject]()
if let
one = self.one as? AnyObject,
two = self.two as? AnyObject {
retval["one"] = one
retval["two"] = two
}
return retval
}
}
// create struct
let writeStruct = Foo(one: 1, two: SteeringItem(ext: "one",bitmap: 1)!)
print(writeStruct, "\n")
// write to plist
let writeDict = writeStruct.toDictionary() as NSDictionary
let path = ("~/test.plist" as NSString).stringByExpandingTildeInPath
writeDict.writeToFile(path, atomically: true)
// print contents of file
print(try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding))
// read plist and recreate struct
if let
readDict = NSDictionary(contentsOfFile: path) as? [String:AnyObject],
readStruct = Foo(dict: readDict) {
print(readStruct)
}
, но это больше не пишет. С String это сработало, с «struct SteeringItem» это не так!
Update 2: класс вместо структуры
class SteeringItem : NSObject, NSCoding {
var ext = String() // extension including dot e.g. ".JPG"
var bitmap = Int() // flag for grouping file types, e.g. photos
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(ext, forKey: "ext")
aCoder.encodeObject(bitmap, forKey: "bitmap")
}
required convenience init?(coder aDecoder: NSCoder) {
let ext = aDecoder.decodeObjectForKey("ext") as! String
let bitmap = aDecoder.decodeObjectForKey("bitmap") as! Int
self.init(ext: ext, bitmap: bitmap)
}
init?(ext: String, bitmap: Int) {
// Initialize stored properties.
self.ext = ext
self.bitmap = bitmap
super.init()
}
}
В зависимости от сложности вашего данных, возможно, стоит проверить «CoreData», чтобы узнать, подходит ли она более подходящей. – Alexander
Вам не требуется «инициализация», если она не может быть выполнена. В этом случае, если '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'инициализация' Таким образом, вам не нужен метод 'init' в вашей' SteeringItem' 'struct'. – ColGraff