NSSecureCodingでオプショナル型の保存、読み込み方法
iOS/macOSアプリでデータを保存する時に、データが色々あるとそのデータを持つクラスを作って、そのクラスがNSSecureCodingプロトコルに従うようにすることが多い。
保存の方法がUserDefaultsだろうがNSKeyedArchiverやFileWrapperなどを使おうがまあいい。ともかくクラスがNSSecureCodingに従ってる場合の話。
このプロトコルに従うとクラスはこんな感じになると思う。
*** -[NSKeyedUnarchiver decodeDoubleForKey:]: value for key (weight) is not a 64-bit float
なんてエラーが出たりする。
まだこのエラーが出るような場合はまだマシで、ビット数を間違えてデータをメモリに展開するのかアプリが起動時に全然関係ないところで「このデータがおかしいで!」と落ちてしまう、という症状が出てた。
結局のところオプショナル型を扱う場合には
どうしてもcoder.decodeFloatを使いたいなら保存時に
macOS 10.15.6 Catalina
Xcode 11.7
Swift 5.2.4
保存の方法がUserDefaultsだろうがNSKeyedArchiverやFileWrapperなどを使おうがまあいい。ともかくクラスがNSSecureCodingに従ってる場合の話。
このプロトコルに従うとクラスはこんな感じになると思う。
class Person: NSObject, NSSecureCoding {これを実行するとname: String?についてはいけるが、weight: Float?について読み込み時に
var name: String?
var weight: Float?
static var supportsSecureCoding = true
// save
func encode(with coder: NSCoder) {
coder.encode(name, forKey: "name")
coder.encode(weight, forKey: "weight")
}
// load
required init(coder: NSCoder) {
super.init()
name = coder.decodeObject(forKey: "name") as? String
weight = coder.decodeFloat(forKey: "weight”)
}
}
*** -[NSKeyedUnarchiver decodeDoubleForKey:]: value for key (weight) is not a 64-bit float
なんてエラーが出たりする。
まだこのエラーが出るような場合はまだマシで、ビット数を間違えてデータをメモリに展開するのかアプリが起動時に全然関係ないところで「このデータがおかしいで!」と落ちてしまう、という症状が出てた。
結局のところオプショナル型を扱う場合には
//weight = coder.decodeFloat(forKey: "weight”)のようにしてやるといいみたい。
weight = coder.decodeObject(forKey: "weight”) as? Float
どうしてもcoder.decodeFloatを使いたいなら保存時に
coder.encode(weight!, forKey: "weight")のようにunwrapすれば可能。もちろん変数がnilではないことが前提だけど。
func decodeFloat(forKey key: String) -> Float確かにリファレンスだと↑このように返り値はFloatなのでnilだと返せないよな。
macOS 10.15.6 Catalina
Xcode 11.7
Swift 5.2.4
スポンサーサイト
<< NSTableViewであるセルを編集できないようにする TopPage NSTableViewでセルの編集をしたい時にハマったこと >>
トラックバック
トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1359-7a465323
https://ringsbell.blog.fc2.com/tb.php/1359-7a465323