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

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

相关·内容

  • oc深坑測试题及其答案[通俗易懂]

    一、选择题(共80题,每题1分) 1、 不会立马使引用计数器改变的是: 答案:(C) A、release B、alloc C、autorelease D、retain 2、 在OC中类的接口声明keyword为: 答案:(B) A、@import B、@interface C、@implemention D、@protocol 3、 NSString *name = [[NSString alloc]initWithString:@”张三”];NSLog(@”%d”,[name retainCount]);上述代码打印结果是: 答案:(A) A、-1 B、0 C、1 D、2 4、 下列选项中所有属于对象的是: 答案:(C) A、我的白色iPhone4s;Mac Mini B、狗;老虎 C、邻居家的猫咪“贝贝”;我的弟弟“张三” D、保时捷;犀利哥 5、 NSDictionary *dict = [NSDictionary dictionaryWithObject:@”a value” forKey:@”aKey”];NSLog(@”%@”,[dict objectForKey:@”aKey”]);[dict release];控制台中打印的最后一条信息会是: 答案:(C) A、a value B、aKey : a value C、崩溃信息 D、a value : aKey 6、 现有例如以下集合,能准确删除“张三”的代码是:NSMutableDictionary * peoples=[NSMutableDictionary dictionaryWithObjectsAndKeys:@”张三”,@”左护法”,@”李四”,@”右使”,@”唐sir”,@”老大哥”, nil]; 答案:(A) A、[peoples removeObjectForKey:@”左护法”]; B、[peoples removeObject:@”张三”]; C、[peoples removeObjectAtIndex:0]; D、[peoples removeAllObjects]; 7、 关于类和对象的概念,下列属于对象的是: 答案:(C) A、奥迪A6 B、保龄球 C、世界冠军刘翔 D、西红柿 8、 下面说法不对的是: 答案:(A) A、nonatomic:提供多线程保护,提高性能,在没有使用多线程的编程中能够选择使用。 B、assign:属性默认值。说明设置器直接进行赋值。针对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等等。

    03
    领券