更新可编码的用户结构

问题描述 投票:0回答:2

我正在开发一个应用程序,遇到问题时,用户最多可以创建5个个人资料。

问题:

致命错误:解开可选值:文件时意外发现nil

Info:

该应用的第一版具有一个结构,其中包含这些数据点:

  • id
  • profileName
  • profileIcon

打开应用程序后,它将通过func loadUser()加载用户]

现在,在更新期间,我在用户结构中添加了一个新的数据点,因此现在看起来像这样:

  • id
  • profileName
  • profileIcon
  • profileSummary
  • 现在,当调用func loadUser()时,此语句失败:

致命错误:解开可选值:文件时意外发现nil

系统的构建方式:

首次打开应用程序时,它将创建5个空配置文件。然后,用户可以“激活”并填写这些个人资料,他/她会喜欢。

我不确定如何处理此问题。如何在不导致应用程序崩溃的情况下将新数据点添加到我的结构中?

源代码:

struct User: Codable {
  // Core user data
  let id:                     Int
  var profileName:            String
  var profileIcon:            String
  var profileSummary:         String
}

class DataManager: NSObject {

/// Used to encode and save user to UserDefaults
func saveUser(_ user: User) {

   if let encoded = try? JSONEncoder().encode(user) {
        UserDefaults.standard.set(encoded, forKey: "userProfile_\(user.id)")
        print("Saved user (ID: \(user.id)) successfully.")
   }

}

/// Used to decode and load user from UserDefaults
func loadUser(_ userID: Int) -> User {
    var user : User?

    if let userData = UserDefaults.standard.data(forKey: "userProfile_\(userID)"),
        let userFile = try? JSONDecoder().decode(User.self, from: userData) {
        user = userFile
        print("Loaded user (ID: \(user!.id)) successfully.")
    }

    return user!
}

 /// Used to create x empty userprofiles ready to be used
func createEmptyProfiles() {
    // May be changed, but remember to adjust UI
    var profilesAllowed = 5

    while profilesAllowed != 0 {
        print("Attempting to create empty profile for user with ID \(profilesAllowed)")

        let user = User(id: profilesAllowed, profileName: "", profileIcon: "", profileSummary: "Write a bit about your profile here..")

        self.saveUser(user)

        print("User with ID \(profilesAllowed) was created and saved successfully")

        // Substract one
        profilesAllowed -= 1
    }
}

 //MARK: - Delete profile
func deleteUser(user: User) -> Bool {

    var userHasBeenDeleted = false
    var userToDelete = user

    // Reset all values
    userToDelete.profileName = ""
    userToDelete.profileIcon = ""
    userToDelete.profileSummary = ""

    // Save the resetted user
    if let encoded = try? JSONEncoder().encode(userToDelete) {
        UserDefaults.standard.set(encoded, forKey: "userProfile_\(user.id)")
        print("User has now been deleted")
        userHasBeenDeleted = true
    }

    return userHasBeenDeleted

  }
}

我正在开发一个应用,在遇到问题时,用户最多可以创建5个个人资料。问题:致命错误:展开一个可选值时意外发现nil:文件信息:...

swift codable
2个回答
0
投票

我找不到您的结构的任何问题。因其他原因导致崩溃。


0
投票

两个选项:

© www.soinside.com 2019 - 2024. All rights reserved.