使用 NSUserDefaults 保存数组会使应用程序崩溃

2024-01-07

我觉得我做的事情好像是正确的,但在数据转换和检索结束时出现错误。请看下面的代码:

class Task:NSObject, NSCoding {
        var name:String
        var notes:String
        var date:NSDate
        var taskCompleted:Bool

        init(name:String, notes:String,date:NSDate, taskCompleted:Bool){
            self.name = name
            self.notes = notes
            self.date = date
            self.taskCompleted = taskCompleted
        }

        required init(coder decoder: NSCoder){
            self.name = (decoder.decodeObjectForKey("name") as! String?)!
            self.notes = (decoder.decodeObjectForKey("notes") as! String?)!
            self.date = (decoder.decodeObjectForKey("date") as! NSDate?)!
            self.taskCompleted = (decoder.decodeObjectForKey("taskCompleted") as! Bool?)!
        }

        func encodeWithCoder(coder: NSCoder) {
            coder.encodeObject(self.name, forKey: "name")
            coder.encodeObject(self.notes, forKey: "notes")
            coder.encodeObject(self.date, forKey: "date")
            coder.encodeObject(self.taskCompleted, forKey: "taskCompleted")
        }
    }

然后我保存并获取数据如下:

let nowData = NSKeyedArchiver.archivedDataWithRootObject([nowTasks])
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(nowData, forKey: "nowData")

let loadedData = defaults.dataForKey("nowData")
let loadedArray = NSKeyedUnarchiver.unarchiveObjectWithData(loadedData!) as! [Task]

当我打电话时print(loadedArray.first)我收到错误:NSArray 元素无法匹配 Swift 数组元素类型


看起来,即使在解码器方法中进行了一些非常奇怪的强制转换,您的代码也应该可以正常工作。尝试这样:

class Task: NSObject, NSCoding {
    var name = String()
    var notes = String()
    var date: NSDate
    var taskCompleted: Bool
    init(name: String, notes: String, date: NSDate, taskCompleted: Bool){
        self.name = name
        self.notes = notes
        self.date = date
        self.taskCompleted = taskCompleted
    }
    required init(coder decoder: NSCoder){
        self.name = decoder.decodeObjectForKey("name") as! String
        self.notes = decoder.decodeObjectForKey("notes") as! String
        self.date = decoder.decodeObjectForKey("date") as! NSDate
        self.taskCompleted = decoder.decodeBoolForKey("taskCompleted")
    }
    func encodeWithCoder(coder: NSCoder) {
        coder.encodeObject(name, forKey: "name")
        coder.encodeObject(notes, forKey: "notes")
        coder.encodeObject(date, forKey: "date")
        coder.encodeBool(taskCompleted, forKey: "taskCompleted")
    }
}

使用 plist 文件进行测试:

let task1 = Task(name: "task1", notes: "note a", date: NSDate(), taskCompleted: false)
let task2 = Task(name: "task2", notes: "note b", date: NSDate(), taskCompleted: true)

let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
let fileURL = documentsDirectory.URLByAppendingPathComponent("data.plist")

if let filePath = fileURL.path {
    NSKeyedArchiver.archiveRootObject([task1,task2], toFile: filePath)
    if let loadedArray = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? [Task] {
        print(loadedArray.count)

        print(loadedArray.first?.name ?? "")
        print(loadedArray.first?.notes ?? "")
        print(loadedArray.first!.date )
        print(loadedArray.first!.taskCompleted)

        print(loadedArray.last?.name ?? "")
        print(loadedArray.last?.notes ?? "")
        print(loadedArray.last!.date )
        print(loadedArray.last!.taskCompleted)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NSUserDefaults 保存数组会使应用程序崩溃 的相关文章

  • Parse.com 因超出突发限制而拒绝服务

    我使用 Parse 创建了一个 iOS 应用程序 其中使用的是从 Parse com 网站下载的 iOS SDK 为了创建此类应用程序 ApplicationID 和 ClientID 密钥都嵌入在 iOS 应用程序中 并在使用应用程序时从
  • 我可以在 where 子句中使用 or ( || ) 吗?

    我正在尝试延长Array类型 但我只希望类型为时可用的函数Int or Float 我知道我可以针对一种类型执行此操作 extension Sequence where Iterator Element Int 但我可以对多种类型执行此操作
  • 文本末尾的空格在右对齐 UITextField 中不可见

    我有一个右对齐的UITextField 最初编辑时 文本末尾不会出现空格 我用这个解决了this https stackoverflow com q 19569688 1971013 替换 与不间断的 u00a0 然而 上面仅在编辑文本字段
  • Xcode 10 命令行构建:存档失败,出现 Fabric Info.plist 错误

    我有用于自动构建 iOS 项目的 Jenkins 服务器 该项目有两个目标 使用命令行实用程序构建项目xcodebuild 完整命令是 usr bin xcodebuild workspace Our project xcworkspace
  • 同一参数有两个不同的名称有什么意义?

    func mapEachElement inArray arr Int withFunc aFunc Int 为什么会有 inArray 然后 arr 有什么意义 对于 withFunc 和 aFunc 也是如此 它使代码变得更加复杂并且阅
  • 图表无法在 Xcode 14 上编译

    我在图书馆中面临以下错误 Type 图表数据集 不符合协议 范围可替换集合 实例方法不可用 替换Subrange with 用于满足协议的要求 范围可替换集合 将其附加到扩展 ChartDataSet RangeReplaceableCol
  • iPhone 6 隐藏在键盘下方的自动校正

    自动修正UITextview在 Iphone5s 中工作正常 但在 iPhone 6 中它被隐藏在键盘后面 在 iPhone 5s 中按预期工作 但不适用于 iphone 6 有什么办法可以解决 iPhone 6 上的这个问题吗 不 去物业
  • 我无法让 HealthKit 工作。缺失的权利

    我很难让 HealthKit 为我的 iOS 应用程序工作 我已经完成了所有步骤到目前为止我已经找到了 http jademind com blog posts healthkit api tutorial 似乎没有一个能解决我的问题 当我
  • 按下后退按钮时 SwiftUI 工具栏项目被剪裁

    我在 SwiftUI 中遇到了一种奇怪的行为 我似乎无法解决它 鉴于以下简单的示例应用程序 我遇到了这种行为 工具栏项目在初始运行时正确呈现 但导航离开并返回它会被剪切 重新创建此示例代码 内容视图 swift import SwiftUI
  • 当 $.each 和 array.splice(i) 放在一起时,JQuery 处理数组超出索引错误

    最近我在互联网上搜索一些可以处理废弃的 ajax xhr 调用的代码 这就是我发现的 https stackoverflow com a 8841412 395910 xhrPool ajaxSetup beforeSend functio
  • Apple 如何通知 iOS 应用程序内购买 (IAP) 退款?

    我在我的应用程序中成功实现了 Apple iOS IAP 并在沙箱中进行了测试 效果很好 我担心用户可能会通过 IAP 购买商品 将其下载到我的应用程序中 然后向 Apple 投诉并获得退款 没有明显的方式将退款报告给我的应用程序 它们是否
  • 在 C# 中通过 C DLL 使用数组和指针

    我对 C 非常陌生 上周才开始学习 我有一个用 C 编写的自定义 DLL 具有以下函数 DLLIMPORT void test function double test 我想要做的是从 C 获取数组 test 的指针 因此 如果在 DLL
  • 如何确定 NSURLSessionTask 请求何时开始?

    I use NSURLSessionTask我正在尝试监视我的一些 HTTP 请求需要多长时间 我可以监视什么委托方法 或其他方法 NSURLSessionTask实际上提出了最初的请求 如果这是一个NSURLConnection里面一个N
  • PHP:从 array_values() 内的值中去除标签

    我想在用选项卡爆炸之前将标签从 array values 内的值中剥离出来 我尝试使用下面的这一行 但出现错误 output implode t strip tags array keys item 理想情况下 我想从值中去掉换行符 双空格
  • 如何读取数组中int的随机数

    我想将空格分隔的整数读取到数组中 当我按 Enter 时 它应该在任何时间点停止读取 如何实现该程序的循环 请帮助我解决这个问题 我已经尝试过下面的代码 但它不起作用 以及如何再次读回 include
  • 关于 S3 文件传输的权限

    我正在使用 S3TransferManager Sample 进行测试 我创建了Cognito并设置了IAM并最后更改了constants swift文件 我上传没有问题 但下载失败 错误信息是 下载失败 错误域 com amazonaws
  • 禁用将应用程序窗口置于前面。关闭另一个窗口后

    我有包含 2 个 NSWindowController 的 OSX 应用程序 我的问题可以通过以下几个步骤来描述 使用 2 个窗口启动应用程序 选择另一个应用程序的窗口 将其中一个窗口放在另一个应用程序窗口前面 第二个窗口将保留在底部 关闭
  • 将 Objective-C 框架 (CocoaPod) 导入 Swift?

    我正在尝试导入libjingle peerconnection框架到我的 Xcode 项目中 但由于某种原因 我无法使用以下命令导入 Objective C 标头import RTCICEServer在 Swift 源文件中 我尝试使用头文
  • UITableView 自动调整行大小约束在 iPhone 6Plus 上神秘破坏

    我有一个自定义的 UITableViewCell 它有一个缩略图和一堆文本 行高配置为使用自动计算 tableView estimatedRowHeight 129 tableView rowHeight UITableViewAutoma
  • 使用 Swift 解析框架

    有人尝试过将 Parse Framework 与 swift 一起使用吗 只要添加桥接文件 您就可以使用 swift 和 Objective C 代码 这是我的查询 从 Parse 返回的 对象 数组正确地包含了我的所有数据 但该方法在将

随机推荐