【问题标题】:what's the difference between single key and keypath?单键和键路径有什么区别?
【发布时间】:2026-02-06 17:40:02
【问题描述】:

this页面所示

[self setValue:[NSNumber numberWithInt:intValue] forKey:@"myObject.value"];

答案是“当然,它是一个键路径而不是单个键”,这是什么意思?

【问题讨论】:

标签: objective-c


【解决方案1】:

键是标识对象属性的字符串。键 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 文档了解更多详情。

【讨论】:

  • 所以键必须是被存储对象的属性名称?如果是这样,那么还有什么替代方法,例如 java 和 C# 中的字典或哈希表?哪里的键可以是任何字符串或对象?
  • @LolaRun 是的,键必须是属性名称。或者在字典的情况下,关键是关键。请参阅my answer 中的示例代码到另一个问题:Directly accessing nested dictionary values in Objective-C
  • 很好的例子和解释。
【解决方案2】:

valueForKey 与 valueForKeyPath

[Objective-C KVC]
[Swift KVC]

  • valueForKey 大约是 KVC
  • valueForKeyPathKVC + 点语法

您可以将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)

【讨论】: