SwiftでUserDefaultsに構造体のArrayを保存したい。
SwiftでUserDefaultに構造体のArrayを保存したく、
以下のコードを書いたのですが、
// コンテンツを保持する構造体
struct ROContents : Codable {
var idString_: String // コンテンツを一意に識別するID文字列
var titleString_: String // タイトル文字列
var readOutString_: String // 読み上げる文字列
// 規定イニシャライザ
init() {
idString_ = ""
titleString_ = ""
readOutString_ = ""
}
}
・・・
func save() -> Bool {
let userDefaults: UserDefaults = UserDefaults.standard
let data = contentsArray_.map { try? JSONEncoder.encode($0) }
・・・
return true
}
以下のエラーが出てしまいます。
'ROContents' is not convertible to 'JSONEncoder'
ROContentsで何らかのプロトコルを実装しないといけないのでしょうか。
=== 追記 ===
ご指摘頂いた通りに以下のようにメソッドを修正しました。
func save() -> Bool {
let userDefaults: UserDefaults = UserDefaults.standard
let encoder = JSONEncoder()
do {
let data = try encoder.encode(contentsArray_)
userDefaults.set(data, forKey: "contentsArray")
} catch {
print(error)
return false
}
userDefaults.set(contentsCounter_, forKey: "contentsCounter")
return true
}
func load() -> Bool {
let userDefaults: UserDefaults = UserDefaults.standard
let decoder = JSONDecoder()
do {
let data = userDefaults.data(forKey: "contentsArray")
contentsArray_ = try [decoder.decode(ROContents.self, from: data!)]
} catch {
print(error)
return false
}
contentsCounter_ = userDefaults.integer(forKey: "contentsCounter")
return true
}
実行してみた所
save()の方は問題なかったのですが、
load()の方は、以下のエラーが発生してしまいます。
typeMismatch(Swift.Dictionary, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary but found an array instead.", underlyingError: nil))
戻り値がDictionaryなのに、配列(Array)に入れようとしている。
ということだと思うのですが、decodeのやり方が間違っているのでしょうか。