LoginSignup
7
6

More than 5 years have passed since last update.

struct-archiverを使って構造体をNSDataに変換する

Posted at

struct-archiverって何?

Swift向けの構造体とNSDataを相互変換するステキライブラリです。構造体を含む配列も容易に変換することができ、データの送受信や記録などに便利です。

構造体の定義

CustomArchivable を継承?した構造体を定義する。

struct SomeStruct: CustomArchivable {
    var id: String
    var name: String

    // `restoreProcedure` を記述して構造体を返す必要がある
    public static var restoreProcedure: ArchiveRestoreProcedure {
        return {
            (dictionary: ArchivableDictionary) in

            // 復元時に辞書が渡ってくるので値を取得して構造体を返すように
            if let id = dictionary["id"] as? String, let name = dictionary["name"] as? String {
                return NearbyTelemetrySessionStruct(id: id, name: name)
            }
            return NearbyTelemetrySessionStruct(id: "", name: "")
        }
    }
}

struct-archiverの初期化

AppDelegate 内で SomeStruct をstruct-archiverで取り扱えるようにする。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
    StructArchiver.activateStandardArchivables(withCustomStructActivations: {
        // struct-archiverを使う構造体を列挙
        SomeStruct.activateArchive()
    })

    return true
}

ArrayとNSDataの相互変換

NSDataにする

let a = SomeStruct(id: "a", name: "a")
let b = SomeStruct(id: "b", name: "b")
let c = SomeStruct(id: "c", name: "c")

// 配列の場合は **Archivables型として扱う**
let array: Archivables = [a, b, c]

let data = array.archivedData

Arrayにする

let array = StructArchiver.unarchive(data: data)
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6