【发布时间】:2026-02-06 17:40:02
【问题描述】:
如this页面所示
[self setValue:[NSNumber numberWithInt:intValue] forKey:@"myObject.value"];
答案是“当然,它是一个键路径而不是单个键”,这是什么意思?
【问题讨论】:
-
谢谢,但您应该将其发布为答案,以便我将其标记为答案
标签: objective-c
如this页面所示
[self setValue:[NSNumber numberWithInt:intValue] forKey:@"myObject.value"];
答案是“当然,它是一个键路径而不是单个键”,这是什么意思?
【问题讨论】:
标签: objective-c
键是标识对象属性的字符串。键 path 是由点分隔的键列表,用于标识嵌套属性。
这是一个例子。如果一个对象person 有一个属性address,它本身也有一个属性town,您可以使用键分两步获得城镇值:
id address = [person valueForKey:@"address"];
id town = [address valueForKey:@"town"];
或使用 keyPath 一步完成:
id town = [person valueForKeyPath:@"address.town"];
查看Key-Value Coding 上的 Apple 文档了解更多详情。
【讨论】:
valueForKey 与 valueForKeyPath
valueForKey 大约是 KVC
valueForKeyPath 是 KVC + 点语法您可以将valueForKeyPath 用于根属性,但不能将valueForKey 用于嵌套属性
A has -> B has -> C
//root properties
B *b1 = [a valueForKey:@"b"];
B *b2 = [a valueForKeyPath:@"b"];
//nested properties
C *c1 = [a valueForKey:@"b.c"]; //[<A 0x6000016c0050> valueForUndefinedKey:]: this class is not key value coding-compliant for the key b.c. (NSUnknownKeyException)
C *c2 = [a valueForKeyPath:@"b.c"];
附加上下文
//access to not existing
[a valueForKey:@"d"]; //runtime error: [<A 0x600003404600> valueForUndefinedKey:]: this class is not key value coding-compliant for the key d. (NSUnknownKeyException)
//they both return `id` that is why it is simple to work with them
id id1 = [a valueForKey:@"b"];
B *b1 = (B*) id1;//[b1 isKindOfClass:[B class]]
//or
B *b2 = [a valueForKey:@"b"];
//Wrong cast
C *c1 = [a valueForKey:@"b"];
[c1 fooC]; //-[B fooC]: unrecognized selector sent to instance 0x600001f48980 (NSInvalidArgumentException)
【讨论】: