- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些代码将一个对象分配给一个通用 id 变量,然后根据该对象所属的类执行各种操作(假设每个类都正确定义并实现了适当的属性):
id obj = #<this could be one of several things>#
id result;
if ([obj class] == [MyClass1 class])
{
result = [obj myProp1];
}
else if ([obj class] == [MyClass2 class])
{
result = [obj valueForKey:@"myProp2"];
}
else if ([obj class] == [MyClass3 class])
{
result = obj.myProp3; // this doesn't compile!
}
else
{
result = nil;
}
关于 MyClass1 和 MyClass2 片段,在非动态情况下(属性名称是常量),使用 KVC 是否比直接将消息发送到对象更合适或更好?使用 KVC 技术是否涉及更多的开销,因此它应该只在被调用的属性名称是动态的时使用吗?我想了解一下什么时候使用 KVC 是个好主意。
关于 MyClass3 的代码片段 - 为什么使用点语法会导致编译错误?这不是本质上只是向 getter 访问器发送一条消息,类似于 MyClass1 示例吗?
最佳答案
不,KVC 不被认为更合适。执行此操作的理想方法是在知道对象是什么后将其转换为类类型。你也在错误地测试类(class)。您应该改用 -isKindOfClass:
。您现在的类测试大致等同于使用 -isMemberOfClass:
。
id obj = getObj();
id result = nil;
if ([obj isKindOfClass:[MyClass1 class]]) {
result = [(MyClass1 *)obj myProp1];
} else if ([obj isKindOfClass:[MyClass2 class]]) {
result = [(MyClass2 *)obj myProp2];
} else if ([obj isKindOfClass:[MyClass3 class]]) {
result = ((MyClass3 *)obj).myProp3;
}
关于objective-c - 哪个更好- [obj propName] 或 [obj valueForKey : @"propName"] when using an id pointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6514204/
我有一些代码将一个对象分配给一个通用 id 变量,然后根据该对象所属的类执行各种操作(假设每个类都正确定义并实现了适当的属性): id obj = ## id result; if ([obj cla
我正在试用 jsRender。 我想做的事情: JS 模板: {{* if ("{{=theaterId}}" == getCurrentTheaterId()) {
我正在学习如何使用 react-native(Android)实现 Firestore。然后,我找到了 'react-native-firebase' 并陷入了这个异常。 Error:Exceptio
假设我们有这段代码(简化示例): $propertyName = 'items'; $foo = new \stdClass; $foo->$propertyName = array(42); 此时我
我正在尝试从子组件向父组件发出事件。 家长: parent .ts onChangeUpload(event){ console.log('event'); console.log(event
我想获取 JSON 数据,将其存储在状态中,然后通过 props 将其传递给组件。在我想使用 map 函数的组件中,它向我显示了这个错误:类型错误:this.props.dataQueries.map
我的@Output 有问题,或者至少父组件中的事件有问题。父级 HTML: Accountmanagement Add Employee Username E-Mail
我在 NodeJS 上遇到了一个非常奇怪的 Javascript 错误。 我有一个巨大的 data.json 文件 (24MB)。我通过阅读它 var data = JSON.parse(fs.rea
我遇到了一个奇怪的问题。我研究了这个错误,它通常似乎与 @Output 或 EventEmitter 的使用有关,但这里并非如此。 如果我有特定的 polyfill,我的应用程序会出现以下错误: Ty
我需要覆盖 grails.serverURL在运行时无需重新生成应用程序的 WAR 文件。我尝试了各种设置方式 grails.serverURL在 application.properties文件,无
嗨,我最近偶然发现了这个案例,但我不知道发生了什么: 在自调用的匿名函数中,我将对象原型(prototype)扩展为: (function () { Object.defineProperty(Obj
我是一名优秀的程序员,十分优秀!