我正在尝试将结构值存储到数组中,而我想将其存储到User-default中的同一数组并检索以显示tableview。
struct item:Codable {
var title : String!
var size : String!
init(title: String, size: String) {
self.title = title
self.size = size
}
}
我正在使用以下存储方式
UserDefaults.standard.set(try? PropertyListEncoder().encode(items), forKey:"items")
然后找回
if let data = UserDefaults.standard.value(forKey:"items") as? Data {
let items_user = try? PropertyListDecoder().decode(Array<item>.self, from: data)
print("*************\(String(describing: items_user))")
}
但是输出得到
Optional([ZLib.item(title: Swift.ImplicitlyUnwrappedOptional<Swift.String>.some("con-smash.gsheet"), size: Swift.ImplicitlyUnwrappedOptional<Swift.String>.some("120 KB"))])
如何删除optional
和ZLib.item(
以上Swift.ImplicitlyUnwrappedOptional<Swift.String>.some(
不必要的信息。
答案 0 :(得分:3)
首先,结构名称应该以大写字母开头
只需删除结构中的感叹号即可。
如果存在带有非可选值的初始化程序,则永远不要将成员/属性声明为IUO 。
struct Item : Codable {
var title : String
var size : String
init(title: String, size: String) {
self.title = title
self.size = size
}
}
第二个
切勿将value(forKey
与UserDefaults
一起使用。
在这种情况下,有一个专用方法data(forKey
,否则对标量使用object(forKey
或其他专用方法(integer(forKey
,bool(forKey
等)。但这与问题无关。
if let data = UserDefaults.standard.data(forKey:"items") {
最后,catch
在使用Codable
时始终会出错,并且请勿滥用String(describing
初始化程序
do {
let itemsUser = try PropertyListDecoder().decode(Array<Item>.self, from: data)
print("*************", itemsUser)
} catch { print(error) }
}
要在print
语句中删除应用名称,请使用CustomStringConvertible
并添加自己的description
struct Item : Codable, CustomStringConvertible {
var title : String
var size : String
init(title: String, size: String) {
self.title = title
self.size = size
}
var description : String {
return "title : \(title), size : \(size)"
}
}
答案 1 :(得分:0)
您可以使用“ String
”而不是“ String!
”来避免打印“ Swift.ImplicitlyUnwrappedOptional.some(”)。
try?
意味着您将获得一个可选对象,因此您将获得“ Optional([ZLib.item(......]
您可以尝试以下操作:
do {
let items_user = try PropertyListDecoder().decode(Array<item>.self, from: data)
} catch {
//error
}
或:
let items_user = try! PropertyListDecoder().decode(Array<item>.self, from: data)