Swift 删除可选项和不必要的字符 iOS

Swift remove optionals and unnecessary characters iOS

我正在尝试将结构值存储到数组中,我想将它存储到用户默认值中并检索以显示表视图。

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(不必要的信息。

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

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

如果存在具有非可选值的初始化程序,则永远不要将成员/属性声明为 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)"
    }
}

您可以使用“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)