首页
学习
活动
专区
工具
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。

5.6K50

窥探Swift数组安全索引与数组切片

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

2.5K50

Swift基础 集合类型

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

7900

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.2K20

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

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

2.1K50

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

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

1.4K20

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

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

93740

窥探Swift数组与字典

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

1.8K90

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.5K70

来一次有侧重点区分Swift与Objective-C

相比于OCnil更加安全和简明 swift泛型类型更加方便和通用,而非OC只能为集合类型添加泛型 swift各种方便快捷高阶函数(函数式编程) (Swift标准数组支持三个高阶函数:map...协议和协议扩展可以让我们更合理地方使用类型。引用类型和类型一个主要区别就是类型如何传递。当我们传递引用类型(class)实例,我们传递对原实例引用。...这意味着所做任何更改都会反射回原实例。当我们传递类型实例,我们传递对原实例一份拷贝。这意味着所做任何更改都不会反射回原实例。...- 多态 接口重用,父指针能够指向子类对象 当父引用指向子类对象,就发生了向上转型,即把子类类型对象转成了父类型。...SwiftXcode不可能让这种问题编译通过Objective-C中下面这段代码编译不会报警告和错误 NSObject *v1 = [NSObject new]; NSString *

3.5K30

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

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

95840

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

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

1.3K31

常用开发技巧系列(四)

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

1K90

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

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

4.8K20

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.2K10

iOS开发之 Method Swizzling 深入浅出

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

2.3K70

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

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

84310

储存篇 - CoreData使用大全

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

2.4K20
领券