Почему переменные и методы передаются как строки в target-c?
Как разработчик iOS с базовым опытом в C++, я сравниваю многие функции языков. Мне интересно, почему имена переменных в этом примере фрагмента кода:
[bankInstance addObserver:personInstance
forKeyPath:@"accountBalance"
options:NSKeyValueObservingOptionNew
context:NULL];
передаются как строка @, а не указатель, например?
3 ответа
Это ключевой путь. Это не обязательно имя переменной; вместо этого это список свойств. В этом случае список содержит только один элемент, но в других случаях это может быть что-то вроде @"account.balance.inDollars"
где каждый элемент в цепочке имеет свое свойство, которое ищется по имени.
Что касается того, почему вы не просто пишете, скажем, account.balance.inDollars
- хорошо, подумайте, что бы это делало, если бы вы заменили его там. Он получит доступ к свойству, когда вы установите наблюдателя и передадите текущее значение свойства. Это не то, что мы хотим. Вместо этого мы хотим сообщить механизму наблюдения, как искать само свойство, чтобы оно могло отслеживать изменения, и это делается с помощью кодирования значения ключа. (Это также позволяет вам устанавливать графические привязки в Интерфейсном Разработчике.)
То, что вы заметили, не обязательно является именем переменной. Скорее, это свойство (и имя переменной, которая его поддерживает, может быть тем же именем или другим, в зависимости от @synthesize для свойства).
Это позволяет несвязанным классам получать доступ к свойствам другого класса при определенных обстоятельствах, таких как доступ только для чтения, без необходимости показывать другие части класса.
В Swift вы можете использовать #keyPath()
создать ключевую строку пути.
let keyPathString = #keyPath(BankAccount.accountBalance)
Во время компиляции токены внутри ()
будет проверен как действительный путь ключа.
Это значительно лучше, чем написание собственных строковых литералов пути ключа, так как компиляторы будут предупреждать вас об ошибках, вызванных опечатками или рефакторингами.