Де різниця між setObject: forKey: та setValue: forKey: в NSMutableDictionary?


153

Переглядаючи документацію, я навряд чи бачу великої різниці. І "значення", і "об'єкт" мають тип id , тому може бути будь-який об'єкт. Ключ - це один раз рядок, а в іншому - ідентифікатор. Один з них, здається, зберігає об'єкт, а інший - ні. Що ще? Який із яких випадків?


Відповіді:


163

setValue:forKey:є частиною протоколу NSKeyValueCoding , який, крім усього іншого, дозволяє вам отримувати доступ до властивостей об’єкта з лайків Interface Builder. setValue:forKey:реалізується в інших класах NSDictionary.

setObject:forKey:є NSMutableDictionary'sпідставою існувати. Його підпис, як правило, схожий на setValue: forKey :, але більш загальний (наприклад, будь-який тип ключа). Дещо збіг обставин, що підписи такі схожі.

Що додає плутанини в тому, що реалізація NSMutableDictionary setValue:forKey:еквівалентна setObject:forKey:у більшості випадків. В інших класах setValue:forKey:змінює членські змінні. У NSMutableDictionaryньому він змінює записи словника, якщо ви не встановите префікс ключа символом "@" - у цьому випадку він змінює членські змінні.

Отже, у двох словах, використовуйте, setObject:forKey:коли вам потрібно працювати зі словниковими ключами та значеннями, а також setValue:forKey:у більш рідкісних випадках, коли вам потрібно вирішити KVP .

EDIT: і о, схоже, на це було задано і відповіли раніше: Різниця між objectForKey та valueForKey?


це питання не зовсім те саме. мова йде про методи геттера, тоді як це питання про методи
сеттера

1
Що ви маєте на увазі під "NSMutableDictionary", він змінює записи словника, якщо ви не встановите префікс ключа символом "@", і в цьому випадку він змінює членські змінні. " Які змінні члена? Також, можливо, ви можете прокоментувати stackoverflow.com/questions/5755917 ? Дякую.
Петро Штібрані

просто для повноти, setObject: forKey підніме (виняток), якщо об’єкт дорівнює нулю. Чи буде setValue: forKey поводиться так само, чи він видалить існуючий об’єкт зі словника, коли встановить нуль для ключа?
Motti Shneor

Чудова відповідь. Дійсно. для повноти, хоча б непогано зазначити, що (принаймні на NSMutableDictionary) setValue: forKey: толерує нульові значення та видаляє запис - while setObject: forKey: буде викидати винятки та збивати при передачі нульових значень.
Мотті Шноор

83

Інша відмінність полягає в тому, що якщо ви надаєте значення нуля setValue:forKey:, він видаляє ключ зі словника, якщо він існує, інакше нічого не робить. Але якщо надати нульове значення setObject:forKey:, це спричинить виняток.


10
Це дуже корисно знати. Інакше я написав власну категорію на NSMutableDictionary, щоб досягти саме цього! Спасибі
Арман

2
Ще одна відмінність полягає в підписці на об'єктив-c, ви можете написати, dic[key] = value;щоб підтримати видалення ключа, якщо значення є nil. Підписка, як правило, кращий підхід, ніж setValue:forKey:досягнення цього.
Cœur


4

anObject - значення для ключа. Об'єкт отримує збережене повідомлення перед тим, як додати його до NSDictionary. Це значення не повинно бути нульовим.

aKey - ключ до значення. Ключ копіюється (використовуючи copyWithZone:; ключі повинні відповідати NSCopyingпротоколу). Ключ не повинен бути нульовим.

value - значення для ключа.

key - ключ для значення. Зверніть увагу, що при використанні кодування ключа-значення, ключ повинен бути рядком (див. "Основи кодування ключа-значення").


Дякуємо, що вказали причину, чому setObject: forKey: піднімає виняток. @breakfreehg
simbesi.com
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.