首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在swift中将object数组编码为UserDefaults时出错

在Swift中,将object数组编码为UserDefaults时出错可能是因为UserDefaults只支持存储特定的数据类型,如整数、浮点数、布尔值、字符串等,而不支持存储自定义对象或数组。

解决这个问题的一种方法是将object数组转换为NSData类型,然后再存储到UserDefaults中。可以使用NSKeyedArchiver来实现对象的归档和解档。

以下是一个示例代码,演示了如何将object数组编码为NSData,并存储到UserDefaults中:

代码语言:txt
复制
import Foundation

// 定义一个自定义对象
class Person: NSObject, NSCoding {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    // 归档方法
    func encode(with coder: NSCoder) {
        coder.encode(name, forKey: "name")
        coder.encode(age, forKey: "age")
    }
    
    // 解档方法
    required init?(coder: NSCoder) {
        name = coder.decodeObject(forKey: "name") as? String ?? ""
        age = coder.decodeInteger(forKey: "age")
    }
}

// 创建一个object数组
let persons = [Person(name: "John", age: 25), Person(name: "Jane", age: 30)]

// 将object数组转换为NSData
let data = NSKeyedArchiver.archivedData(withRootObject: persons)

// 存储到UserDefaults中
UserDefaults.standard.set(data, forKey: "persons")

// 从UserDefaults中读取数据
if let storedData = UserDefaults.standard.data(forKey: "persons"),
   let storedPersons = NSKeyedUnarchiver.unarchiveObject(with: storedData) as? [Person] {
    // 成功读取数据
    for person in storedPersons {
        print("Name: \(person.name), Age: \(person.age)")
    }
} else {
    // 读取数据失败或数据为空
    print("Failed to retrieve data from UserDefaults.")
}

在上述示例中,我们定义了一个名为Person的自定义对象,并实现了NSCoding协议中的归档和解档方法。然后,我们创建了一个包含Person对象的object数组。通过NSKeyedArchiver将object数组转换为NSData,并使用UserDefaults将其存储起来。最后,我们从UserDefaults中读取数据,并将其解档为Person对象数组。

请注意,这只是解决问题的一种方法,具体的实现方式可能因实际需求而有所不同。此外,腾讯云并没有直接相关的产品或产品介绍链接地址与此问题相关。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用Codable归档Swift对象

UserDefaults非常适合存储简单的设置,例如整数和布尔值,但是当涉及复杂数据——例如自定义Swift类型——我们需要做更多的工作。...当使用这样的数据Swift我们提供了一个很棒的协议,称为Codable:一种专门用于存档和取消存档数据的协议,这是一种“将对象转换为纯文本然后再次转换”的奇特方式。...当使用仅具有简单属性的类型(字符串,整数,布尔值,字符串数组等),支持归档和取消归档的唯一需要做的就是向Codable添加一致性,如下所示: struct User: Codable { var...firstName: String var lastName: String } Swift将自动我们生成一些代码,这些代码将根据需要为我们存档和取消存档User实例,但是我们仍然需要告诉Swift...在这种情况下,我们实际上并不在乎使用哪种数据,因为它们只会存储UserDefaults中。 要将用户数据转换为JSON数据,我们需要在JSONEncoder上调用encode()方法。

2K30

使用 Codable 归档 Swift 对象

UserDefaults非常适合存储简单的设置,例如整数和布尔值,但是当涉及复杂数据——例如自定义Swift类型——我们需要做更多的工作。...当使用这样的数据Swift我们提供了一个很棒的协议,称为Codable:一种专门用于存档和取消存档数据的协议,这是一种“将对象转换为纯文本然后再次转换”的奇特方式。...当使用仅具有简单属性的类型(字符串,整数,布尔值,字符串数组等),支持归档和取消归档的唯一需要做的就是向Codable添加一致性,如下所示: struct User: Codable { var...firstName: String var lastName: String } Swift将自动我们生成一些代码,这些代码将根据需要为我们存档和取消存档User实例,但是我们仍然需要告诉Swift...在这种情况下,我们实际上并不在乎使用哪种数据,因为它们只会存储UserDefaults中。 要将用户数据转换为JSON数据,我们需要在JSONEncoder上调用encode()方法。

1.2K20
  • UserDefaults 浅析及其使用管理

    UserDefaults 里面最好使用object(forKey:),这是标准用法。 UserDefaults 底层也是使用的 plist 文件,那它和普通的 plist 文件读取有什么区别呢?...下面介绍两种UserDefaults使用管理的两种方式。 protocol 利用 Swift 中protocol可以有默认实现的特性,可以对UserDefaults进行有效的管理。...取值的方法上借鉴了SwiftyJSON的思想,每种基本结构提供可选值及非可选值两种方式,使用时可根据自己的使用场景灵活使用。 我们如何进行使用呢?见下方代码示例,相关说明见注释。...@propertyWrapper Swift 5.1 推出了 SwiftUI 量身定做的@propertyWrapper关键字,翻译过来就是属性包装器,有点类似 java 中的元注解,它的推出其实可以简化很多属性的存储操作...当存储值不存在返回的默认值 public init(_ key: String, defaultValue: T, userDefaults: UserDefaults = UserDefaults.standard

    1.1K10

    Swift 单元测试入门

    Swift 中编写单元测试 有多种方法可以测试相同的结果,但是当测试失败它并不总是给出相同的反馈。以下提示可帮助您编写测试,通过从详细的失败消息中获益,帮助您更快地解决失败的测试。...例如,测试 JSON 响应的解码: func testDecoding() throws { /// 当数据初始值设定项抛出错误时,测试将失败。...我鼓励您阅读我的文章 《如何使用 XCTest Swift 中测试可选值》以了解更多详细信息。 Xcode 中运行单元测试 编写测试后,就该运行它们了。通过以下提示,这将变得更有效率。...侧边栏中启用覆盖 在编辑器中启用代码覆盖 测试迭代计数向您显示在上次运行测试期间是否命中了特定代码段。 命中提示 它显示了迭代次数(在上面的示例中 3),一段代码在到达变为绿色。...上面的单元测试示例覆盖了所有方法,覆盖率 100%。但是,它并没有测试所有场景,因为它只测试了一个非空数组。同时,也可能存在空数组的情况,其中 hasUsers 属性应该返回 false。

    2.7K40

    iOS14开发-数据存储

    userDomainMask) let url: URL = urlForDocument[0] NSSearchPathForDirectoriesInDomains 访问沙盒目录常用的函数,它返回值一个数组..., iOS 中由于只有一个唯一路径,所以直接取数组第一个元素即可。...不应该直接创建偏好设置文件,而是应该使用UserDefaults类来取得和设置应用程序的偏好。 Library/Caches 目录:主要存放缓存文件,此目录下文件不会在应用退出删除。...跨域 一般情况下使用UserDefaults.standard没有太大问题,但当 App 足够复杂就会产生几个问题: 需要保证设置数据 key 具有唯一性,防止产生冲突。...} catch { print(error) } } } 数据库—sqlite3 由于 Swift 直接操作 sqlite3 非常不方便,所以借助于SQLite.swift

    1K20

    开关组件对比

    这种情况下,做法是启动的时候调用服务端的接口,返回的接口数据中存储对应的值,使用时直接获取存储的值。...}) // 使用时 // 获取存储的值,用于判断 对比 而在09|开关组件:如何使用功能开关,支持产品快速迭代中,作者把开关组件分为了三类:编译开关、本地开关和远程开关 编译开关:让编译器通过检查编译条件来启动后者关闭一些功能...本地开关:让用户App里面手动启动或者关闭一些功能。 远程开关:让产品经理远程遥控App来启动或者关闭一些功能。...通过Swift protocol定义了ToggleType和TogglesDataStoreType两个协议,并定义两个方法,判断开关是否打开、以及更新开关状态 // TogglesDataStoreType.swift...,因为是编译开关,所以更新方法并不需要,但是要写 // BuildTargetTogglesDataStore.swift enum BuildTargetToggle: ToggleType {

    95211

    应用程序内购买教程:入门

    主视图控制器位于MasterViewController.swift中。此类显示表视图,其中包含可用IAP列表。购买存储SKProduct对象数组。...记下Bundle ID,因为接下来的步骤中将需要它。 向下滚动到“ 应用服务”部分。请注意, 默认情况下启用应用程序内购买 和GameCenter。单击继续,然后单击注册和完成。 恭喜!...创建应用内购买产品 提供IAP,您必须首先在App Store Connect中每个单独的购买添加条目。如果您曾在商店中列出待售的应用程序,那么这是一个类似的过程,包括选择购买的定价等级。...IAPHelper.swift中,将return语句 替换isProductPurchased(_:) 以下内容: return purchasedProductIdentifiers.contains...作为购买交易观察员,IAPHelper购买恢复已经收到通知。下一步是通过恢复购买来对此通知做出反应。 打开IAPHelper.swift并滚动到文件的底部。

    5.5K20

    Swift 中的属性包装器

    在这种情况下,Swift 5.1的属性包装器功能非常有用,因为它使我们能够将此类行为和逻辑直接附加到属性本身上,这通常代码重用和归纳开辟了新的机会。...我们所要做的就是将defaultValue属性添加到包装器中,然后底层UserDefaults存储不包含属性键的值使用它。...然而,我们的一些UserDefaults值实际上可能是可选的,如果我们必须不断地指定nil作为这些属性的默认值,那将是不幸的——因为这不是我们不使用属性包装器必须做的事情。...使用Apple的新SwiftUI框架构建UI,这种情况尤为常见,该框架大量使用属性包装器来实现其各种数据绑定API。...同样,这与SwiftUI无关,实际上,使用UIKit,我们也可以采用相同的模式——例如,通过让UIViewController初始化时接受Flag的实例。

    2.6K30

    Mac OSX 开发入门基础系列之NSTask

    Task(图片来自网络) 利用NSTask,我们可以应用中调用外部程序或脚本并获得它的<执行状态和结果 NSTask最为常用的一个场景是命令行操作提供图形化的界面 1....NSTask Swift 中与Objective-C中的不同 Objective-C中, 是NSTask类 Swift 中, 是Process类 3....// 开启执行 listTask.waitUntilExit() } 3.5 使用NSPipe获取NSTask 执行的结果信息 Swift...NotificationCenter.default.addObserver(forName: NSNotification.Name.NSFileHandleDataAvailable, object...小结 NSTask我们提供了可以一个应用中,调用另一个应用<的可能.其中比较普遍的一个使用场景是我们可以自己的App中,调用强大的Shell命令,或者执行自己写的脚本来实现一些辅助功能 NSPipe

    2.2K40

    iOS安全基础之钥匙串与哈希

    我会在本文中,你仔细讲解iOS安全的基础知识。...难道仅仅是因为UserDefaults中不存储base-64编码的用户密码吗?当然不是!对于攻击者来说,恢复以这种方式存储的密码简直再简单不过了,如果是这样,那安全性就很难保证了。...最后,Settings.currentUser由存储UserDefaults中的 user设置的。 不过,此方法并不是最完美的,因为直接存储用户密码并不是最安全的做法。...AuthController.swift中,将isSignedIn更新以下内容: static var isSignedIn: Bool {   // 1   guard let currentUser...Gravatar的概念首先是在国外的独立WordPress博客中兴起的,当你到任何一个支持Gravatar的网站留言,这个网站都会根据你所提供的Email地址你显示出匹配的头像。

    2.8K20

    没有后台可用的 app 快速搭建动态ios审核开关的方法

    最近发现苹果的机审有所改变,希望大家不要欺骗 App Store Review Team,如果侥幸上架成功请在一个月后更成马甲包,否则价格昂贵的公司开发者账号就会马上被封,但是近来的 Uber 审核事件...审核团队身在北美,如果你的 app 不需要支持北美地区,并且有地理位置获取权限,那么直接通过地理位置进行开关即可 通过系统时区判断对方位置已经被证明不可行 预判审核时间,进行硬编码的开关,可能会导致审核比较快的时候...,项目已经上线,但是无法发布给用户(审核开关还是打开的状态,用户得不到审核不允许通过的功能) 这里介绍一个没有后台可用的 app 快速搭建动态审核开关的方法: 新建一个 public 的 GitHub...上面介绍的方法,能不用就不用,能少用就少用,还需自行评估风险哦~ 下面使用 Swift + Alamofire 提供一份代码示例 import UIKit import Alamofire class...2018年12月15日,会直接解锁功能。

    1.4K10

    Ask Apple 2022 中与 Core Data 有关的问答 (下)

    通俗地说,就是创建或修改托管对象实例,Core Data 将自动派生属性生成值。值依据预设的派生表达式( Derived Expression )并通过其他的属性值计算而来。...A:启动检测 UserDefaults 是否空,如果不是,则导入 Core Data,然后删除本地的 UserDefaults。...xxx+CoreDataProperties.swift 中是通过扩展 Entity 的属性创建的声明,xxx+CoreDataClass.swift 是类的定义。...即使你模型编辑器中将属性( 例如字符串 )标记为非可选( 设定了默认值 ),但在从托管对象获取属性值的时候,返回值仍会是 Optional 类型。...当 NSManagedObject 包含关系,对其进行编码是极为困难的。

    3.2K20

    【iOS 开发】3分钟搭建 App Store 动态审核开关

    我曾经一篇文章中写过,希望大家不要欺骗 App Store Review Team,但是近来的 Uber 审核事件,以及发生在我个人身上的 审核团队不对我的长篇详细辩解作正面回答,且无限期推迟我的 App...审核团队身在北美,如果你的 app 不需要支持北美地区,并且有地理位置获取权限,那么直接通过地理位置进行开关即可 通过系统时区判断对方位置已经被证明不可行 预判审核时间,进行硬编码的开关,可能会导致审核比较快的时候...,项目已经上线,但是无法发布给用户(审核开关还是打开的状态,用户得不到审核不允许通过的功能) 这里介绍一个没有后台可用的 app 快速搭建动态审核开关的方法: 新建一个 public 的 GitHub...上面介绍的方法,能不用就不用,能少用就少用,还需自行评估风险哦~ 下面使用 Swift + Alamofire 提供一份代码示例 import UIKit import Alamofire class...2017年11月15日,会直接解锁功能。

    1.1K20

    iOS 面试策略之系统框架-设计模式

    它一般与懒加载一起出现,只有被需要才会创建。单例模式的例子有 UserDefaults.standard,UIApplication.shared,UIScreen.main。... Objective-C 中,它的实现形式 Category 和 Delegation; Swift 中,它的表现形式是 Extension 和 Delegation。...它的文件名一般“类名+扩展名” Extension Swift 中的地位等同于 Category Objective-C 中的地位。...关键词:#通知 #KVO 观察者模是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变,其相关依赖对象皆得到通知并被自动更新。 iOS 开发中典型的推模型实现方式通知和 KVO。...同时配合 NSKeyValueObservation 我们可以更简单的使用 KVO 了,下面是示例代码: // Swift 4 中,NSObject 的类不再自动被推断 @objc,需要用 @objcMembers

    1.6K20
    领券