valueForKeyPath意外返回nil

时间:2017-01-06 05:09:48

标签: objective-c swift key-value-coding

这是一个相当简短的问题,但我对如何修复它感到有些困惑。

for item in filteredAndSortedDates {
     print(item.datesSectionHeader()) // Returns a value
     print(item.value(forKeyPath: "datesSectionHeader") as Any) // Returns nil
     // The "as Any" part up above is just to keep the compiler quiet. It doesn't have any meaning as this is just for testing purposes.
}

我对为什么会发生这种情况感到有些困惑。当上面的值返回值时,valueForKeyPath如何返回nil?我在NSDictionary上打电话给你。

这是我得到的日志:

HAPPENING THIS WEEK
nil
HAPPENING THIS WEEK
nil
HAPPENING THIS WEEK
nil
HAPPENING WITHIN A YEAR
nil

以下是我宣布datesSectionHeader

的方法
extension NSDictionary {

     // FIXME
     func datesSectionHeader() -> String {
         // Doing some work in here.
     }
}

1 个答案:

答案 0 :(得分:1)

NSDictionary修改键值编码的标准行为,以便它访问字典的内容而不是其属性。它通过覆盖value(forKey:)value(forKeyPath:)反过来使用)来实现此目的。

作为documented,它覆盖value(forKey:)检查密钥是否以“@”作为前缀。如果不是,则返回object(forKey:)的结果,访问字典内容。如果它带有“@”前缀,它会删除“@”并返回超类的实现的结果,该实现访问字典的属性。

因此,在这种特殊情况下,您可以使用以下内容从datesSectionHeader() getter方法访问结果:

item.value(forKeyPath: "@datesSectionHeader")