私が読んで試したように、私は単純なデータ型を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"と一緒に動作しませんでした。
アップデート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'を必要としません。そのため、 'struct'に' init'メソッドが定義されていない場合は、メンバーワイズ初期化を行うデフォルトの 'init'があります。したがって、 'SteeringItem'の' struct'に 'init'メソッドは必要ありません。 – ColGraff