首页
学习
活动
专区
工具
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-CNSArray数组索引安全验证方法使用Swift语言进行重新。...当然检索,使用我们上面定义safe方法,并且indexs下标数组存在非法下标。在这种情况下,我们来验证一下我们安全方法。     ...协议,具体实现如下所示,不过下面的方法比较少用,因为一般数组存在越界情况,因为字典,如果你对一个不存在进行索引,会返回nil,而不会崩溃。

    2.6K50

    Swift基础 集合类型

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

    10800

    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.6K50

    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数组

    97540

    窥探Swift数组与字典

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

    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

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

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

    13632

    常用开发技巧系列(四)

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

    1.1K90

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

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

    5K20

    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

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

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

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

    85810

    Objective—C语言新魅力——Nullability、泛型集合与类型延拓

    二、Nullability检测支持         swift语言中,通过!和?可以将对象声明成Optional,用于开发中标记这个对象是否可以为空。...OC,以前没有这样功能,因此我们开发中会经常遇到因为某个函数应该返回实例而返回了空导致崩溃。...如果仅仅是返回给开发者一些提示,你可能觉得应用并不大,是的,对开发者最大帮助这一特性可以用于函数参数,这样我们调用函数起到提示作用,将是非常重要,越是多人合作项目,作用也越大。...开发如下使用,做到提示伙伴我这个数组是什么东西作用: @interface ViewController () {     NSArray __TYPE__FIT_TO__CLASS(NSString... alloc]init]; 声明了这样一个数组后,就好比我告诉了编译器,这个数组数据类型都是NSString*类型,现在非常好,如果我这个数组中元素方法,会出现如下提示: ?

    1K30
    领券