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

在Swift的UserDefault中检索对象数组时出现“键‘根’的值是意外的类'NSArray'”错误

是因为在UserDefault中存储的值与检索时期望的类型不匹配导致的。

UserDefault是一种用于存储小型数据的轻量级持久化方案,它允许我们以键值对的形式存储和检索数据。然而,UserDefault只支持存储特定的数据类型,如字符串、整数、浮点数、布尔值等,而不支持存储自定义对象或对象数组。

当我们尝试从UserDefault中检索一个对象数组时,如果该数组是以NSArray的形式存储的,而不是Swift中的Array类型,就会出现上述错误。这是因为NSArray是Objective-C的类,而Swift的UserDefault只能正确处理Swift的原生数据类型。

要解决这个问题,我们可以将对象数组转换为NSData类型进行存储,或者将对象数组中的每个对象转换为符合UserDefault支持的数据类型进行存储。以下是两种解决方法的示例代码:

方法一:将对象数组转换为NSData类型进行存储

代码语言:txt
复制
// 存储对象数组
let array = [object1, object2, object3]
let data = NSKeyedArchiver.archivedData(withRootObject: array)
UserDefaults.standard.set(data, forKey: "key")

// 检索对象数组
if let data = UserDefaults.standard.data(forKey: "key"),
   let array = NSKeyedUnarchiver.unarchiveObject(with: data) as? [ObjectType] {
    // 使用检索到的对象数组
} else {
    // 处理检索失败的情况
}

方法二:将对象数组中的每个对象转换为符合UserDefault支持的数据类型进行存储

代码语言:txt
复制
// 存储对象数组
let array = [object1, object2, object3]
let convertedArray = array.map { NSKeyedArchiver.archivedData(withRootObject: $0) }
UserDefaults.standard.set(convertedArray, forKey: "key")

// 检索对象数组
if let convertedArray = UserDefaults.standard.array(forKey: "key") as? [Data] {
    let array = convertedArray.map { NSKeyedUnarchiver.unarchiveObject(with: $0) as? ObjectType }
    // 使用检索到的对象数组
} else {
    // 处理检索失败的情况
}

在这两种方法中,我们使用了NSKeyedArchiver和NSKeyedUnarchiver来将对象转换为NSData类型进行存储和检索。需要注意的是,ObjectType应该是符合NSCoding协议的自定义类。

推荐的腾讯云相关产品:腾讯云对象存储(COS) 腾讯云对象存储(COS)是一种安全、耐用、低成本的云存储服务,适用于存储大量非结构化数据,如图片、音视频、备份、恢复、容灾等。您可以通过腾讯云对象存储(COS)来存储和管理您的对象数据。

产品介绍链接地址:https://cloud.tencent.com/product/cos

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

相关·内容

检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005

今天遇到了同样的问题,我们出现的问题是不定时出现日志出现报错信息: Error:检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败...,原因是出现以下错误: 8000401a。..., 报错信息为:检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005 这使我很纠结,...方法一(推荐):   检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a   1...."/>帐号和密码,否则会提示检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。

6K50
  • 窥探Swift之数组安全索引与数组切片

    今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值。在使用数组时,一个常见的致命错误就是数组越界。...并且还会介绍Swift中自定义下标,说白了自定义下标其实就是通过下标的形式与特定的下标值来访问一个对象。自定义下标在有些场合中是非常实用的。然后下方还会给出数组切片的概念与实用方式。...对Swift相关方法介绍时,我会尽量的详细一些,因为毕竟本篇博客主要是关于Swift内容的。接下来将对上面Objective-C中NSArray数组索引安全验证的方法使用Swift语言进行重新。...当然检索时,使用的是我们上面定义的safe方法,并且在indexs下标数组中存在非法的下标。在这种情况下,我们来验证一下我们的安全方法。     ...协议,具体实现如下所示,不过下面的方法比较少用,因为一般是数组存在越界的情况,因为在字典中,如果你对一个不存在的键进行值的索引,会返回nil值,而不会崩溃。

    2.6K50

    Kotlin 的 Property Delegate 与 Swift 的 Property Wrapper

    我们同样可以通过被代理的属性名来查询对应 key 在 Properties 文件中的值,这个逻辑与 SharedPreferences 如出一辙,大家有兴趣可以参考这里:AbsProperties.kt...} } image 在定义时如果定义为 Bitmap?,那么在不需要的时候自然是可以置为 null 的,只不过用的时候每次都需要判空,感觉就很让人难受。...对于 setY 的代理就有些奇怪了,属性 y 只代理了 wrapped::setY,那读取 y 的值时从哪儿获取呢?...说来也有趣,在它的设计文档中还特意 "diss" 了 Kotlin 的属性代理的语法设计:单独为了属性代理搞了一个 by 关键字实在是有些重,在其他场景下也不太好复用,于是 Swift 的属性包装器采用了与...稍微提一句,在 Swift 中,struct 是值类型,class 是引用类型,对于属性包装器来讲,二者都是可以的,用哪个取决于具体需求。

    5.3K20

    Swift基础 集合类型

    数组是有序的值集合。集合是唯一值的无序集合。字典是键值关联的无序集合。 Swift 中的数组、集合和字典始终清楚可以存储的值和键的类型。这意味着您不能错误地将错误类型的值插入集合中。...这样做使您更容易对代码进行推理,并使Swift编译器能够优化您创建的集合的性能。 数组(Arrays) 数组将相同类型的值存储在有序列表中。相同的值可以在不同位置多次出现在数组中。...注意 Swift的Array类型与Foundation的NSArray类桥接。...Sets 集合在集合中存储相同类型的不同值,没有定义的顺序。当项目顺序不重要时,或者当您需要确保项目只出现一次时,您可以使用集合而不是数组。...字典文字是将一个或多个键值对写成Dictionary集合的简写方式。 键值对是键和值的组合。在字典文字中,每个键值对中的键和值由冒号分隔。

    11200

    16道面试官必问你必须会的iOS面试题

    根元类 (root metaclass) 本身的 isa 指针指向自己,这样就行成了一个闭环。上面提到,一个对象能够接收的消息列表是保存在它所对应的类中的。...所以,为了保证父类的类方法可以在子类中可以被调用,所以子类的元类会继承父类的元类,换而言之,类对象和元类对象有着同样的继承关系。...NSObject 的元类继承自 NSObject 类,所以 NSObject 类是所有类的根,因此 NSObject 中定义的实例方法可以被所有对象调用,例如 - (id)init 方法 和 - (void...将 nextLevel 赋值给 level,重复第 3 步的判断。 将 ans 中的节点换成节点的值,返回结果。 因为我们是用 Swift 来实现代码,所以我使用了一些 Swift 语言的特性。...例如:队列中我们保存的是节点的数据结构,但是最终输出的时候,我们需要输出的是值,在代码中,我使用了 Swift 的函数式的链式调用,将嵌套数组中的元素类型做了一次变换,如下所示: let ans = result.map

    2.7K50

    30分钟摸透iOS中谓词NSPredicate的来龙去脉

    30分钟摸透iOS中谓词NSPredicate的来龙去脉 一、引言     在现代汉语的解释中,谓词是用来描述或判断客体性质、特征或者客体之间关系的词项。通俗的说,它是描述事物属性的。...在iOS开发Cocoa框架中,有提供NSPredicate类,这个类通常也被成为谓词类,其主要的作用是在Cocoa中帮助查询和检索,但是需要注意,实质上谓词并不是提供查询和检索的支持,它是一种描述查询检索条件的方式...二、NSPredicate类的应用解析     NSPredicate提供创建谓词对象和解析谓词对象的方法,它也是Cocoa中有关谓词的类中的基类。...我们在日常开发中,NSPredicate类的应用频率也最高。     创建谓词对象有3种方式,分别是通过格式化字符串创建谓词,直接通过代码创建谓词,通过模板创建谓词。...= [NSPredicate predicateWithFormat:@"length = 5"]; //对于这个数组中的字符串,即是检索字符串长度为5的元素 NSArray * test

    1.5K20

    Swift进阶七——面向对象编程

    面向对象编程(OOP,Object Oriented Programing)有三大特性: 继承 封装 多态 在Swift中,面向对象的基本单元如下: 枚举 结构体 类 协议 扩展 枚举 在Swift...实际上,在Swift中,所有的类、结构体和枚举都是可以定义下标操作的,它可以作为访问集合、列表或序列成员元素的快捷方式。你可使用下标通过索引值来设置或者检索值,而不需要为设置和检索分别使用实例方法。...因此,组合总是优于继承的。 类的对象的状态在分享和传递过程中是很难调试的,尤其是在并行程序编码中,该问题就更加明显。...比如一个类的对象经过20层传递,当最后该对象的值出现了问题的时候,我们需要向上一层一层查找是哪一层出现了问题,即便如此,这要是在串行情形下还是不难排查的,如果是在并行,那么就更难排查了。...下面让我们来比较一下OC和Swift中的Array: ? 如上图,左边是OC中的数组的继承体系,右边是Swift中的数组。

    98140

    窥探Swift之数组与字典

    还是沿袭之前的风格,在介绍Swift中的数组时,我们会对比一下ObjC中的数组和字典,因为ObjC也是iOS开发的主要语言不是。...无论是简单还是复杂的程序,数组和字典的用处还是比较多的,这两者虽然是Swift的基础内容,但是也不失其重要性。关于Objc的集合类请参考之前的博客《Objective-C中的集合类》。...有一点需要注意的是ObjC中的数组只允许往里面存储对象,而不允许往里存储基本数据类型(Int, Float等)。而在Swift中是允许把基本数据类型存入数组中的,如下方代码段所示。...在Swift的数组中,如果在声明数组时没有指定数组中元素的数据类型,那么数组中是可以存放不同数据类型的数据的。...下图是在ObjC中对NSArray操作后的结果,你不能对NSArray中的元素进行修改,也就是说你对NSArray的操作权限只有读的权限,没有写的权限。

    1.9K90

    iOS应用数据存储(数据持久化)的常用方式一、iOS数据持久化方式二、应用沙盒(应用程序的文件夹)三、使用方法

    ,NSDocumentDirectory表示是在Documents中寻找,NSCachesDirectory的话就是在cache文件夹中寻找 常用枚举: NSDocumentDirectory NSCachesDirectory...(); Library/Caches: 保存临时文件,后续需要使用,例如:缓存图片,离线数据(地图数据) 系统不会清理cache目录中的文件 就要求程序开发时,必须提供cache目录的清理解决方案...路径获取: 通过NSUserDefaults类存取该目录下的设置信息 ---- 三、使用方法 1、属性列表 属性列表是一种XML格式的文件,拓展名为plist,如果对象是NSString、NSDictionary...、NSArray、NSData、NSNumber等类型,就可以使用, 注意:不能存储自定义对象,会失败的 存方法:writeToFile 读方法:如字典, dictionaryWithContentsOfFile...:@"key_name"]; 3、自定义对象归档 NSKeyedArchiver 注意: 必须遵守NSCoding协议的对象才可以进行归档解档,默NSString、NSDictionary、NSArray

    2.7K70

    iOS_Effective Objective-C 20 编写高质量iOS与OS X代码的52个有效方法

    应该通过取下标操作来访问数组下标或字典中的键所对应的元素 用字面量语法创建数组或字典时,若值中有nil,则会抛出异常。...从类簇的公共抽象基类中继承子类时要当心,若有开发文档,则应首先阅读 10、在既有类中使用关联对象存放自定义数据 ​ 可以给某对象关联许多其他对象,这些对象通过“键”来区分。...如果在两个键上调用isEqual:方法返回YES,那么字典人为二者相等;而在设置关联对象值时,若向令两个键匹配到同一个字,则二则必须是完全相同的指针才行。...鉴于此,在设置关联对象值时,通常使用静态全局变量做键。...如果按“引用数”回溯,那么最终会发现一个“根对象”(root object)。在iOS应用程序中,则是UIApplication对象,是程序启动时创建的单例。 ​

    1.1K40

    OC - 属性关键字和所有权修饰符

    但是如果我们对数组进行操作,比如说给数组添加对象或者移除对象,是不在 atomic 的负责范围之内的,所以给被 atomic 修饰的数组添加对象或者移除对象是没办法保证线程安全的。...这些关键字可以用于属性、方法返回值和参数中,来指定对象的可空性,这样编写代码的时候就会智能提示。在 Swift 中可以使用!和?...这样就会造成一个问题:在 Swift 与 Objective-C 混编时,Swift 编译器并不知道一个 Objective-C 对象到底是optional还是non-optional,因此这种情况下编译器会隐式地将...但是如果我们对数组进行操作,比如说给数组添加对象或者移除对象,是不在atomic的负责范围之内的,所以给被atomic修饰的数组添加对象或者移除对象是没办法保证线程安全的。...由于属性被声明为NSMutableArray类型,就不避免的会有调用方去调用它的添加对象、移除对象等一些方法,此时由于copy的结果是NSArray不可变对象,对NSArray对象调用添加对象、移除对象等方法

    1.4K31

    Realm数据库 从入门到“放弃”

    查询(Queries):要在数据库中检索信息,我们需要用到“检索”操作。检索最简单的形式是对Realm( )数据库发送查询消息。...这里需要注意,addOrUpdateObject这个方法不是增量更新,所有的值都必须有,如果有哪几个值是null,那么就会覆盖原来已经有的值,这样就会出现数据丢失的问题。...集合通知是异步触发的,首先它会在初始结果出现的时候触发,随后当某个写入事务改变了集合中的所有或者某个对象的时候,通知都会再次触发。...解决办法: 通过调用invalidate,来告诉 Realm 您不再需要那些拷贝到 Realm 的数据了。这可以使我们不必跟踪这些对象的中间版本。在下次出现新版本时,再进行版本更新。...以下是可以完成的操作: 父类中的类方法,实例方法和属性可以被它的子类所继承 子类中可以在方法以及函数中使用父类作为参数 以下是不能完成的: 多态类之间的转换(例如子类转换成子类,子类转换成父类,父类转换成子类等

    5.1K20

    常用开发技巧系列(四)

    ,友盟反馈给你的错误是下面这样的,得分析一下这个日志才能查定位到为题具体是出现在哪一行代码上,日志像下面所示: ?        ...,先一步一步来看这个问题,造一下这个错误,截张图给大家看看,还有一点这个Crash在你Debug的时候你在Xcode上点击下一步程序是还能运行的,但在你手机上的话就直接Crash,其实是很严重的一个错误...的解释在这: 在xcode 6.4 中使用swift和object-c混合编程,同时通过cocoapods进行管理的一些问题和解决办法 五:在导入第三方框架的时候,由于Swift的版本出现的问题         ...UDID             ios5.0之后禁止       IDFA             广告ID,ios6.0之后出现,在同一个设备上的所有APP都会获取到相同的值,用户可以在设置-隐私-...广告追踪中关闭它的获得,会出现获取不到情况。

    1.1K90

    Apple 营收有望再创新高 | Swift 周报 issue 47

    这些操作涉及从 Firebase 初始化和检索 IdeaSnapshotModel,所需的行为是仅在成功检索 ideaSnapshot 时显示按钮。...5) 讨论来自镜像主题的数组构造函数?内容大概该提案建议在 Swift 中为数组类型引入一个新的初始值设定项,允许从镜像主题创建它。...尝试保存类模型时会出现此问题,并且在预览窗口和运行应用程序时都会发生此问题,特别是在输入特定导航链接(时间表)时。...用户在特定情况下希望自定义字符串插值的行为,特别是在本地化字符串的上下文中。 他们提供了一个示例,其中使用可变大小写的字符串插值动态构造本地化字符串键。...该摘要捕获了用户对 appendLiteral 的正确使用以及他们在 Swift 中为本地化字符串键自定义字符串插值的具体情况的询问。

    14032

    Object-C中的黑魔法

    1.NS_ASSUME_NONNULL_BEGIN && NS_ASSUME_NONNULL_END 在Swift中存在Option类型,也就是使用?和!声明的变量。...但是OC里面没有这个特征,因为在XCODE6.3之后出现新的关键词定义用于OC转SWIFT时候可以区分到底是什么类型 __nullable && ___nonnull __nullable指代对象可以为...NULL或者为NIL __nonnull指代对象不能为null 当我们不遵循这一规则时,编译器就会给出警告。...老代码在需要和swift混编时,在新的swift编译器下会给出一个警告。 nonnull不会影响性能。事实上,我们仍然可以在运行时去判断我们的对象是否为nil。...特别是,返回值是我们可控的东西,如果返回值是nonnull的,则我们不应该返回nil,除非是为了向后兼容。

    1.3K10

    建议大型项目用上Try Catch建议大型项目用上Try Catch

    建议大型项目用上Try Catch 我们在平时项目做功能的时候,经常会遇到崩溃的情况。如果是我们在开发测试阶段,我们可以找到原因修复。但是遇到已经上线,出现这种问题。...最近写的项目用Swift语法进行编写的,对于之前我们在Object-C中NSError**类型的指针标识遇到了什么错误,现在转成Swift方法直接进行throws进行抛异常。...我们平时遇到的一些崩溃问题所在 数组越界 给一个可变数组强行赋值不可变,之后当做可变数组用 字典值不存在 后台返回的字段不统一,本来有值是字典,没值是字符串。...我们看一下常见的一个数组越界的例子: NSArray *tests = @[]; NSNumber *num = tests[0]; 我们不用运行就可以知道这个地方会崩溃,因为我们初始化的数组是空的。...关于Try catch的资料可以查看下面资料: iOS捕获异常,常用的异常处理方法 Swift中错误和异常处理

    85910

    iOS开发之 Method Swizzling 深入浅出

    指代了不同概念,然而我们通常会说在消息发送过程中,这三个概念是可以相互转换的。...Selector是一个在运行时被注册(或映射)的C类型字符串。Selector由编译器产生并且在当类被加载进内存时由运行时自动进行名字和实现的映射。...该方法的第一个参数指向调用方法的自身(即内存中类的实例对象,若是调用类方法,该指针则是指向元类对象(metaclass)。第二个参数是这个方法的名字selector,该方法的真正参数紧随其后。...[xg5j821wjw.png] [c6im9zbj30.png] Method Swizzling 使用注意 类簇设计模式 在iOS中NSNumber、NSArray、NSDictionary等这些类都是类簇...如果多次调用了[super load],可能会出现“Swizzle无效”的假象,原理见下图: [dos2ufzkl1.png] Swift 自定义类中使用 Method Swizzling 要在 Swift

    2.4K70

    储存篇 - CoreData使用大全

    在传统的项目中我们都使用OC变成,但是CoreData默认使用的是Swift语言,所以我们要设置回来OC,详情见图片 ? 同时需要将codegen选为Manaul/None ?...=%@", @"lifengfeng"]; request.predicate = predicate; //遍历所有实体,将每个实体的信息存放在数组中 NSArray...这里有个坑,在Xcode8中,Codegen下拉选择框中增加了Class/Definition这一选项,而且是默认的预设值,这时候系统会自动帮我们这个实体创建了NSManagedObject子类,我们不需要再创建实体类...,最坑的是,这些自动创建的类,在导航面板是看不见的!!!...但是在使用过程中会出现大量代码, 而且CoreData学习曲线比较陡峭,如果掌握不好,在使用过程中很容易造成其他问题。

    2.6K20
    领券