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

Swift -`NSUnnownKeyException`:在字典中有可选值的NSObject上调用` `setValue:forKey`

Swift - NSUnknownKeyException 是在字典中有可选值的 NSObject 上调用 setValue:forKey 时可能出现的异常。

在 Swift 中,NSUnknownKeyException 是 Objective-C 运行时异常的一种,它表示在运行时尝试访问一个不存在的键值对时抛出的异常。通常情况下,这个异常会在使用 KVC(键值编码)时出现。

KVC 是一种通过字符串键值来访问对象属性的机制,它允许我们通过字符串来访问对象的属性或调用方法。在 Swift 中,NSObject 的子类可以使用 KVC。

当我们在一个字典中使用 KVC 时,如果字典中不存在对应的键值对,或者键对应的值为 nil(可选值),那么在调用 setValue:forKey 方法时就会抛出 NSUnknownKeyException 异常。

为了避免出现 NSUnknownKeyException 异常,我们可以在调用 setValue:forKey 方法之前,先判断字典中是否存在对应的键值对,或者对可选值进行解包操作。

以下是处理 NSUnknownKeyException 异常的一种示例代码:

代码语言:txt
复制
if let value = dictionary["key"] {
    object.setValue(value, forKey: "property")
} else {
    // 处理字典中不存在对应键值对的情况
}

在这个示例中,我们首先通过 dictionary["key"] 来获取字典中的值,并将其赋给一个可选值 value。然后,我们使用可选绑定来判断 value 是否存在。如果存在,就调用 setValue:forKey 方法将值设置到对象的属性上;如果不存在,就可以在 else 分支中处理字典中不存在对应键值对的情况。

需要注意的是,这只是处理 NSUnknownKeyException 异常的一种方式,具体的处理方式可以根据实际情况进行调整。

推荐的腾讯云相关产品:腾讯云函数(云原生 Serverless 服务)

腾讯云函数是腾讯云提供的一种事件驱动的无服务器计算服务,可以帮助开发者在云端运行代码而无需关心服务器的管理。腾讯云函数支持多种编程语言,包括 Swift,可以方便地进行函数计算和事件处理。通过使用腾讯云函数,开发者可以更加灵活地处理和响应各种事件,提高开发效率和系统的可伸缩性。

产品介绍链接地址:腾讯云函数

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

相关·内容

iOS底层学习——KVC上篇

KVCObjective-C中定义:KVC定义都是对NSObject,扩展来实现(Objective-C中有个显式 NSKeyValueCoding类别名-分类)。...这是我们要探索重点。 1.设调用setValue:forKey:代码时,底层执行机制是怎样呢?...官方文档中有相关说明,见下图: 翻译过来意思是: setValue:forKey: 默认实现,给定key和value参数作为输入,尝试将名为key属性设置为value,接收调用对象内部,...如果找到,直接使用输入(或解包)设置变量并完成。未找到访问器或实例变量时,调用 setValue:forUndefinedKey:。...官方文档中有相关说明,见下图: 根据官方内容,翻译之后可以得出如下实现机制: 首先按get,,is,_顺序方法查找getter方法,找到的话会直接调用

43830

KVC 和 KVO

拓展方法基本为 - (id)valueForKey:(NSString *)key; - (void)setValue:(nullable id)value forKey:(NSString *)key...; 也就是说,基本Objective-C里所有的对象都支持KVC操作,操作包含如上两类方法,动态读取和动态设。...KVC运行时首先会优先调用属性getter和setter,这一点可以代码输出第二行和第三行看到,如果没有,就会优先搜索_property,不存在则搜索property,如果仍然没有,就会调用setValue...作为一个非正式协议,你使用该协议类中看不到惯用写法,实际,这个协议只是隐式地由NSObject实现,继承NSObject子类默认能够使用这个协议。...开发人员不需要添加任何代码,不需要设计自己观察者模型,直接可以工程里使用。其次,KVO架构非常强大,可以很容易支持多个观察者观察同一个属性,以及相关

68910
  • Swift| 基础语法(四)

    前言 总结下 swift基础语法,里面涉及到:常量&变量、Swift数据类型、逻辑分支、循环、字符串相关、数组和字典、方法书写调用等内容,考虑到阅读体验分多篇来展示,希望对大家学习swift...如果这个闭包是函数执行完后才被调用调用地方超过了这函数范围,所以叫逃逸闭包。 举个例子 就是我们常用masonry或者snapkit添加约束方法就是非逃逸。因为这闭包马上就执行了。...闭包循环引用问题 Swift开发中,有一个原则就是能不写self就不写self,但是闭包中必须写上self; 这是因为闭包是用来保存一段代码,而且系统也不知道这段代码具体调用时间, 所以为了保证闭包中对象不被释放...中关于循环引用解决方案 weak var weakSelf = self 那么原先代码中只需要把self改成weakSelf即可 // 由于weakSelf为可选类型,这里必须保证有,所以加上!..., forKey key: String) { super.setValue(value, forKey: key) } //过滤掉 不存属性对应key override func setValue

    1.4K10

    iOS中KVC与KVO应用解析 原

    model2,Model2类中有一个字符串,我们可以通过如下方式赋值取值 //Model.h #import "Model2.h" @interface Model : NSObject {     ...(KVO) KVO是一种消息监听机制,可以某个量发生变化时候将消息传送给监听者,因此广泛用于传,界面低耦合等逻辑中。... = 0x01,//回调字典中存放新     NSKeyValueObservingOptionOld = 0x02,//回调字典中存放旧     NSKeyValueObservingOptionInitial... ,//改变前进行回调     NSKeyValueObservingOptionPrior//改变前后都进行回调 }; //回调字典后面会解释 - (void)removeObserver:(NSObject...,change是一个字典字典中根据监听选项不同,存放不同(新或者旧)。

    32310

    iOS runtime--获取类信息

    iOS runtime--获取类信息 iOS中可以通过runtime获取一个类相关信息:有哪些方法、有哪些协议、有哪些属性、有哪些成员变量。...//属性列表 class_copyIvarList //成员变量列表 准备 定义一个Person类继承Human类,一个协议包括两个方法,一个是必须实现require,一个为可选实现...swift实现,所以有些操作是要加上@objc swift中通过NSClassFromString方法获取class时需要这个类所在文件名.类名这样拼接。...================ "name" "gender" "age" "country" 我们给age添加上@objc,使用setValue:forKey方法直接赋值,最后查看是否赋值成功p.description...let value = personDic[key] debugPrint(key, value) p.setValue(value, forKey: key)

    1.4K41

    iOS - 关于 KVC 一些总结

    默认实现调用每个键值对setValue:forKey:方法 ,会根据需要用nil替换NSNull对象。...如果集合中有非集合元素,会导致Crash。 使用嵌套运算符时,如果有任何操作对象为nil, 则valueForKeyPath:方法将引发异常。...非对象处理 KVC支持基础数据类型和结构体,使用KVC进行赋值或取值时候,会自动非对象和对象之间进行转换。...注意: 因为Swift所有属性都是对象,所以这里仅适用于Objective-C属性。 当进行赋值如setValue:forKey:时,如果key数据类型是非对象类型,则value就禁止传nil。...基本 Setter 搜索模式 以下是setValue:forKey:方法默认实现,给定key和value作为输入参数,尝试将KVC调用属性名为key设置为value,执行以下过程。

    1.9K10

    iOS kvc

    改动 setValue:forKey: setValue:forKeyPath: setValue:forUndefinedKey: setNilValueForKey: 当对非类对象属性设置...究竟是如何获取和设置类成员。 搜索简单成员 如:基本类型成员。单个对象类型成员:NSInteger。NSString*成员。 a. setValue:forKey搜索方式: 1....is name顺序搜索成员名。(设变量名字为name) 3. 假设找到设置成员。假设没有调用setValue:forUndefinedKey:。...调用setValue:forUndefinedKey:。 KVC还提供了以下功能 2.4 正确性核查 KVC提供属性确认API。...找到则调用,未找到默认返回YES。 注意当中内存管理问题。 2.5 集合操作 集合操作通过对valueForKeyPath:传递參数来使用,一定要用在集合(如:array)

    21430

    swift4.0语法杂记(精简版)

    但是开发中将变量赋值为空是在所难免事情,因此就推出了可选类型。 可选类型是swift一大特色,定义变量时,如果指定这个变量是可选的话,就是说这个变量可以有一个指定类型或者为nil。...swift中有规定,对象中任何属性创建对象时,都必须有明确初始化。 5、可选绑定 用if let/var表示。...["name"] = "小仙女" as NSObject dictM["age"] = 17 as NSObject dictM.removeValue(forKey:"name") //获取:swift...中只保留了最简单写法,OC中有objectforkey方法swift中也被删除掉了。...用KVC方式将字典取出来,要调用系统setValue方法就必须先调用系统构造函数创建出对象。为了防止取出对象没有属性而导致程序奔溃,需要重写系统setValue方法。

    15.4K90

    KVC 使用方法详解及底层实现你要知道KVC、KVO、Delegate、Notification都在这里

    KVC需要由类别Category NSKeyValueCoding来支持,OC实现KVC时没有采用实现接口方式,而是针对NSObject创建了一个类别,通过这样方式使得NSObject子类可以自行实现...但似乎上面栗子输出结果与我们预期不同,明明通过setValue:forKey:为name属性设置是Jiaming Chen但通过valueForKey:输出结果却与_name属性一致,连输出地址都一样...:方法,如果不实现该方法设置不存在key时默认抛出异常,实际开发中通常需要从服务端获取大量json数据,转换为字典后往往需要一个属性一个属性赋值,使用KVC方法就能够避免编写冗长代码,但有时服务端和客服端数据名称会有不同...实际开发中还遇到过一种情况,iOS端对象使用NSString类型存储用户ID,但服务端返回是int类型数据,赋值时就会崩溃,解决该问题需要我们自己实现setValue:forKey:方法,该方法中判断...:forKey:方法调用与普通方法相同,所以,这里猜测底层实现可能是执行KVC相关方法时,继承树上沿着isa指针按照之前讲解顺序去查找相关属性进行赋值和获取值操作。

    1.3K70

    OC史上最实用runtime总结,面试、工作你看我就足够了

    利用以上思路,我们还可以给 NSObject 添加分类,统计创建了多少个对象,给控制器添加分类,统计有创建了多少个控制器,特别是公司需求总变时候,一些原有控件或模块添加一个功能,建议使用该方法!...[self setValue:value forKey:key]; // 这两步就相当于以前 self.age = [aDecoder decodeObjectForKey:@"_age"];...id value = dict[key]; // 如果模型属性数量大于字典键值对数理,模型属性会被赋值为nil而报错 if (value == nil) continue; // 将字典设置到模型...= [class objectWithDict:value]; } } // 将字典设置到模型 [self setValue:value forKeyPath:key]; }...array.count; i++) { [mArray addObject:[class objectWithDict:value[i]]]; } value = mArray; } } // 将字典设置到模型

    1.5K20

    iOS_Runtime、method swizzing (俗称黑魔法) 一

    本文举例说明Runtime一下几个用途: 1、拦截并替换方法 2、给分类添加属性 3、字典转模型 4、动态添加方法,处理一个未实现方法和去除报错 5、动态设置变量,可设置私有属性 6、实现NSCoding...,只会调用一次 + (void)load { // class_getClassMethod 获取某个类方法 // method_exchangedImplementations 交换两个方法地址...- (void)setName:(NSString *)name { // objc_setAssociatedObject 将某个 赋值给某个对象某个属性 objc_setAssociatedObject...(包含字典字典字典套数组 情况) (1)NSObject分类实现 #import "NSObject+arrayContain.h" #import @implementation...:value forKey:key]; } } return objc; } (2)定义一个协议,返回字典: 数组名 对应 类名 #import <Foundation

    38130

    iOS 开发:『Runtime』详解(四)获取类详细属性、方法

    [instance setValue:obj forKey:key]; } }]; // 跳转到对应控制器 [[XXJumpControllerTool...实现大体思路如下:借助 Runtime 可以动态获取成员列表特性,遍历模型中所有属性,然后以获取到属性名为 key, JSON 字典中寻找对应 value;再使用 KVC 或直接调用 Getter...那么字典转换成数据模型时候,就要考虑 模型嵌套模型、模型嵌套模型数组 情况了。...= nil) { [object setValue:value forKey:propertyNameStr]; } } free...但是如果数据模型中有多个属性的话,我们不得不对每个属性进行处理,这个过程非常繁琐。 这里我们可以参考之前『字典转模型』 代码。通过 Runtime 获取类属性列表,实现自动归档和解档。

    2.8K40

    Swift基础语法(四)

    比如说,iOS开发中有这样一个网络请求: let request = URLRequest(url: URL(string: "https://xxx")!)...4 student[keyPath:\Student.name] //设置 student.age = 20 //Swift 3 之前 student.setValue(22, forKey: "...Apple给我们做好了桥接工作,不过,OC项目中调用Swift,与Swift项目中调用OC,处理方式是不一样。...4,Swift文件内容如下: import UIKit class NormanPerson: NSObject { //Swift代码中,将需要暴露给OC调用属性和方法前面加上@objc...为什么需要命名空间 简而言之就是一句话:为了避免命名冲突。 开发中,尤其是多模块开发中,很难保证模块之间类名不会重复。为了保证不同模块下同名类可以正常使用而不报错,此时就需要命名空间了。

    3.9K20

    详解:RxSwift-KVO底层探索(

    [1240] *** KVO我们实际开发之中运用非常之多,很多开发者都知道原理!但是这些原理是如何来,一般都是浅尝辄止。...KVO与计算型属性关系 下面我们开始分析,首先感谢苹果开源精神,Github可以直接下载,我们通过 Swift 源码展开分析 public func willChangeValue(for...自动开关 很明显我们计算型属性willSet里面就调用willChangeValue,didSet调用didChangeValue,的确我们计算型属性是和我们KVO相关方法是有所关联,这里也直接证明...} [info unlock]; } [self willChangeValueForDependentsOfKey: aKey]; } 通过pathInfo获取回之前...我们探索完KVO底层实现才能说是真正掌握了,而不是通过面试宝典背下结论,那是没有什么意义!

    77520
    领券