Где различие между setObject:forKey: и setValue:forKey: в NSMutableDictionary?

Мягкий перенос

можно сказать браузеры, где разделить длинные слова путем вставки мягкого переноса (­):

averyvery­longword

может быть представлен как [1 128]

averyverylongword

или

длинное слово

averyvery-
, хорошее регулярное выражение может гарантировать, что Вы не будете вставлять их если необходимый:

/([^\s-]{5})([^\s-]{5})/ → $1­$2

Браузеры и поисковые системы достаточно умны для игнорирования этого символа при поиске текста и Chrome, и Firefox (не протестировали других), игнорируют его при копировании текста в буфер обмена.

элемент

Другая опция состоит в том, чтобы ввести , формирователь изм IE , который является теперь в HTML5:

averyverylongword

Повреждения без дефиса:

длинное слово

averyvery
можно достигнуть того же с пробелом нулевой ширины (или ).

к вашему сведению существует также CSS hyphens: auto , поддерживаемый последним IE, Firefox и Safari (, но в настоящее время не Chrome):

div.breaking {
  hyphens: auto;
}

Однако, что расстановка переносов основана на словаре переносов и она, как гарантируют, не нарушит длинные обещания. Это может сделать выровненный текст более симпатичным все же.

жалующееся на Ретро решение

для расположения плохо, но display:table на других элементах прекрасен. Это будет столь же изворотливым (и эластичным), как олдскульные таблицы:

div.breaking {
   display: table-cell;
}

overflow и white-space: pre-wrap ответы ниже хороши также.

153
задан EI Captain v2.0 25 December 2015 в 13:04
поделиться

1 ответ

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

setObject: forKey: является причиной существования NSMutableDictionary . Его сигнатура очень похожа на setValue: forKey :, но является более общей (например, любой тип ключа). Это отчасти совпадение, что подписи так похожи.

Что добавляет путаницы, так это то, что реализация NSMutableDictionary setValue: forKey: эквивалентна setObject: forKey: в большинстве случаи. В других классах setValue: forKey: изменяет переменные-члены. В NSMutableDictionary он изменяет словарные статьи, если вы не добавляете к ключу префикс символа '@' - в этом случае он изменяет переменные-члены.

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

РЕДАКТИРОВАТЬ: и о, похоже, об этом уже спрашивали и на него ответили раньше: Разница между objectForKey и valueForKey?

163
ответ дан 23 November 2019 в 22:06
поделиться