2017-01-06 6 views
1

Это довольно короткий вопрос, но я немного смущен тем, как его исправить.valueForKeyPath возвращает nil неожиданно

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. 
    } 
} 
+0

печати журнал в вашем вопросе –

+0

Sure! Позвольте мне добавить его прямо сейчас. – Harish

+0

print (item.value (forKeyPath: "dateSectionHeader") как NSString) –

ответ

1

NSDictionary изменяет стандартное поведение Coding Key-Value, так что он получает доступ к содержание словаря, а не его свойства. Он делает это, переопределяя value(forKey:) (который, в свою очередь, используется value(forKeyPath:)).

Как documented, его переопределение value(forKey:) проверяет, имеет ли ключ префикс «@». Если это не так, он возвращает результат object(forKey:), обращаясь к содержимому словаря. Если он имеет префикс «@», он удаляет «@» и возвращает результат реализации суперкласса, который обращается к свойствам словаря.

Таким образом, в данном конкретном случае, вы можете получить доступ к результатам из метода datesSectionHeader() газопоглотительных, используя следующий:

item.value(forKeyPath: "@datesSectionHeader") 

 Смежные вопросы

  • Нет связанных вопросов^_^