迅速删除可选和不必要的字符iOS

时间:2018-08-15 05:12:35

标签: ios swift tableview nsuserdefaults

我正在尝试将结构值存储到数组中,而我想将其存储到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"))])

如何删除optionalZLib.item(以上Swift.ImplicitlyUnwrappedOptional<Swift.String>.some(不必要的信息。

2 个答案:

答案 0 :(得分:3)

首先,结构名称应该以大写字母开头

只需删除结构中的感叹号即可。

如果存在带有非可选值的初始化程序,则永远不要将成员/属性声明为IUO

struct Item : Codable {
    var title : String
    var size : String

    init(title: String, size: String) {
        self.title = title
        self.size = size
    }
}

第二个

切勿将value(forKeyUserDefaults 一起使用。

在这种情况下,有一个专用方法data(forKey,否则对标量使用object(forKey或其他专用方法(integer(forKeybool(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)