Оператор с использованием точечного синтаксиса дает ожидаемый результат, а синтаксис скобок - нет
Возможный дубликат:
В чем разница между синтаксисом точек и синтаксисом в квадратных скобках?
Я пытался использовать эти два выражения:
[[[self display] text] stringByAppendingFormat:digit];
self.display.text = [self.display.text stringByAppendingFormat:digit]
куда display
это UILabel
а также digit
является NSString
,
Я намерен установить digit
как лейбл text
, но когда я пытался запустить программу, только № 2 дал правильные результаты.
Так в чем же разница между этими двумя выражениями? Неправильно ли использовать квадратные скобки для метода получения и установки?
Я проверил этот похожий вопрос: в чем разница между синтаксисом точек и синтаксисом в квадратных скобках?, но до сих пор не могу понять это.
2 ответа
Два синтаксиса абсолютно эквивалентны. Точечный синтаксис преобразуется в синтаксис скобок компилятором. Проблема в том, что вы не устанавливаете значение в своем первом фрагменте. Если вы измените его на:
[[self display] setText:[[[self display] text] stringByAppendingFormat:digit]];
Вы увидите тот же результат, что и с точками.
Я бы предложил использовать временную переменную, чтобы сделать ее немного более читабельной:
NSString * oldText = [[self display] text];
[[self display] setText:[oldText stringByAppendingFormat:@"%@", digit]];
Также обратите внимание, что у вас должна быть строка формата в качестве первого аргумента stringByAppendingFormat:
, Если твой digit
В строке случайно были указаны спецификаторы формата, это может привести к сбою. Лучший выбор здесь будет stringByAppendingString:
- [oldText stringByAppendingString:digit]
,
По сути, нет никакой разницы между ними.
Я не знаю, мистически ли вы сбросили несколько кодов, но когда вы используете -
[[[self display] text] stringByAppendingFormat:digit];
Вы не присвоили результат выражения вашей переменной. вам следует:
self.display.text = [[[self display] text] stringByAppendingFormat:digit];
Надеюсь, это поможет
Шани