В Objective-C можно использовать _cmd
как ключ для objc_getAssociatedObject
, как описано в этом NSHipster article. В Swift только __FUNCTION__
выполняет аналогичную задачу с _cmd
. Но я не уверен, безопасно ли это сделать.Можно ли использовать `__FUNCTION__` в качестве ключа для` objc_getAssociatedObject`
ответ
objc_getAssociatedObject()
нужен уникальный указатель в качестве ключа. В Objective-C _cmd
имеет тип SEL
, который является указателем и является уникальным в соответствии с указанной статьей.
В Swift, __FUNCTION__
имеет тип String
, который не является указателем. При переходе к функции, ожидающей указателя, строка преобразована (возможно, в NSString
как в Swift, Strings and Memory Addresses). Не гарантируется, что это преобразование дает один и тот же указатель в каждом вызове. Вот простой пример, который демонстрирует проблему в Playground:
func bar(ptr : UnsafePointer<Void>) {
print(ptr)
}
func foo() {
bar(__FUNCTION__)
bar(__FUNCTION__)
}
foo()
Выход:
0x00007f8173c06500
0x00007f8173e00020
Как вы можете видеть, тот же __FUNCTION__
передается как два разных указателей на функции bar()
.
Это кажется, что в составленном проекте, вы получите тот же указатель для каждого вызова, но это - насколько я знаю - не документированы, и с тех пор он не работает в Playground я бы не полагайтесь на это.
Поэтому я считаю это не безопасно использовать __FUNCTION__
как ключ для связанных с ними объектов.
Безопасным способом было бы использовать адрес глобальной собственности , как в Is there a way to set associated objects in Swift?.
Это нормально использовать в качестве ключа, это всего лишь буква String
. Тем не менее, вы должны стараться избегать objc_getAssociatedObject
и время выполнения объекта-c в целом при использовании Swift, поскольку оно не поддерживается для всех типов, и это противоречит идее безопасности в Swift. Надеюсь пальцы скрещены мы увидим более динамические возможности интроспекции с Swift 3.
- 1. Можно ли использовать изменяемый объект в качестве ключа в словаре?
- 2. Можно ли использовать NSLocalizedString в качестве ключа в словаре?
- 3. Можно ли использовать массив в качестве ключа карты в java?
- 4. Можно ли использовать StringBuffer в качестве ключа в HashMap?
- 5. MongoDB - Можно ли использовать ObjectId в качестве ключа?
- 6. Можно ли использовать случайный сгенерированный BigInt в качестве первичного ключа?
- 7. Можно ли использовать идентификационную карточку человека в качестве первичного ключа?
- 8. Можно ли использовать тип (a) в качестве словарного ключа?
- 9. Можно ли использовать переменную javascript в качестве ключа массива PHP?
- 10. Можно ли использовать HashSet в качестве ключа к HashMap?
- 11. Может ли массив Java можно использовать в качестве HashMap ключа
- 12. Можно ли использовать двоеточие в качестве идентификатора?
- 13. Можно ли использовать класс в качестве указателя?
- 14. Можно ли использовать строку в качестве индекса?
- 15. Можно ли использовать диапазон в качестве ключа для хэша в Ruby?
- 16. Можно ли использовать указатели в качестве клавиш карты в Go?
- 17. Как использовать объект objc_setAssociatedObject/objc_getAssociatedObject внутри объекта?
- 18. Можно ли использовать хэш обычного текста в качестве ключа для шифрования?
- 19. Можно ли использовать JDBC в качестве уровня абстракции для РСУБД?
- 20. Можно ли использовать файл elf в качестве библиотеки для apk?
- 21. Можно ли использовать WebSockets в качестве прокси-сервера для бедных?
- 22. Можно ли использовать MvxNotifyPropertyChanged в качестве замены для реализации INotifyPropertyChanged?
- 23. Можно ли использовать JSP в качестве шаблона для сервлета?
- 24. Можно ли использовать угловой-ui-bootstrap typeahead в качестве автозаполнения?
- 25. Можно ли использовать лямбда в качестве словаря по умолчанию?
- 26. objc_getAssociatedObject возвращает нуль
- 27. Можно использовать тип ключа для словаря?
- 28. Как использовать строку в качестве ключа для консультативной блокировки PostgreSQL?
- 29. Можно ли использовать символы двойной кавычки как часть ключа hashmap?
- 30. Возможно ли использовать PositiveIntegerField в качестве внешнего ключа в Django?