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

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

44030

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的架构非常的强大,可以很容易的支持多个观察者观察同一个属性,以及相关的值。

69310
  • 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是一个字典,字典中根据监听的选项不同,存放不同的值(新或者旧)。

    32410

    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 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: 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

    38630

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

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

    2.9K40

    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底层实现才能说是真正的掌握了,而不是通过面试宝典背下结论,那是没有什么意义!

    78120
    领券