web-dev-qa-db-ja.com

Swift辞書をファイルに書き込む

NSDictionariesをSwiftのファイルに書き込むことには制限があります。私がAPIドキュメントと このスタックオーバーフローの回答 から学んだことに基づいて、キータイプはNSStringである必要があり、値タイプもNSxタイプである必要があり、Int、String、および他のSwiftタイプが機能しない可能性があります。問題は、次のような辞書がある場合です:Dictionary<Int, Dictionary<Int, MyOwnType>>、plistファイルに迅速に書き込み/読み取りするにはどうすればよいですか?

14
AKH

とにかく、MyOwnTypeをファイルに保存する場合、MyOwnTypeNSObjectのサブクラスでなければならず、NSCodingプロトコルに準拠する必要があります。このような:

class MyOwnType: NSObject, NSCoding {

    var name: String

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

    required init(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObjectForKey("name") as? String ?? ""
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(name, forKey: "name")
    }
}

次に、Dictionaryを次に示します。

var dict = [Int : [Int : MyOwnType]]()
dict[1] = [
    1: MyOwnType(name: "foobar"),
    2: MyOwnType(name: "bazqux")
]

だから、ここにあなたの質問が来ます:

Swift辞書をファイルに書き込む

NSKeyedArchiverを使用して書き込み、NSKeyedUnarchiverを使用して読み取ることができます。

func getFileURL(fileName: String) -> NSURL {
    let manager = NSFileManager.defaultManager()
    let dirURL = manager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false, error: nil)
    return dirURL!.URLByAppendingPathComponent(fileName)
}

let filePath = getFileURL("data.dat").path!

// write to file
NSKeyedArchiver.archiveRootObject(dict, toFile: filePath)

// read from file
let dict2 = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as [Int : [Int : MyOwnType]]

// here `dict2` is a copy of `dict`

しかし、あなたの質問の本文では:

plistファイルに迅速に書き込み/読み取りするにはどうすればよいですか?

実際、NSKeyedArchiver形式はバイナリplist です。しかし、その辞書が必要な場合plistの値としての場合、DictionaryNSDataNSKeyedArchiverでシリアル化できます。

// archive to data
let dat:NSData = NSKeyedArchiver.archivedDataWithRootObject(dict)

// unarchive from data
let dict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [Int : [Int : MyOwnType]]
27
rintaro