Ошибка "Свойство setVariableName not found" при использовании точечной нотации для установки свойства
Я только начал изучать Objective-C, и я не уверен, когда использовать точечную запись против квадратных скобок. Я знаю, что подобный вопрос был задан здесь, но я все еще не совсем понимаю разницу. Я прочитал это [myObject doSomething]
а также myObject.doSomething
эквивалентны. Хотя я не уверен, что когда я использую @property
чтобы сгенерировать метод, он автоматически генерирует метод установки, который я могу использовать только с квадратными скобками.
// MyClass.h
@interface MyClass : NSObject
@property int number;
// main.m
MyClass *object = [[MyClass alloc] init];
[object setNumber:3];
object.setNumber = 4; // Property 'setNumber' not found
Почему я получаю сообщения об ошибках, когда пишу object.setNumber = 4
и почему я могу использовать только квадратные скобки для этого?
2 ответа
Вы получаете эту ошибку, потому что свойство называется number
не указан Number. В языках ООП принято создавать методы, которые обращаются к данным объекта с помощью "сеттеров" и "геттеров". Свойство в Objective-C 2.0 синтезирует этот процесс и автоматически генерирует установщики и получатели. Если вы заходите в MyClass.m и вводите - setN
вы увидите setNumber, предложенный Xcode. Это потому, что вы можете сами реализовать свои установщики и получатели, чтобы настроить их поведение или оставить поведение по умолчанию, просто устанавливая значение или получая значение.
Кроме того, свойства автоматически генерируют объявление переменной как _variableName
Например, поведение вашего свойства по умолчанию будет следующим:
- (void) setNumber:(int)number {
_number = number
}
- (int) getNumber {
return _number;
}
Определение того, следует ли использовать один поверх другого, действительно сводится к последовательности. Для обеспечения согласованности в командах необходимо иметь руководство по стилю. Возьмите, например, " Нью-Йорк Таймс". Они ограничивают точечную запись строго свойствами и скобками для не свойственных методов (т. Е. Методов установки и получения).
Вы путаете методы и свойства.
Когда вы создаете свойство, да, он создает метод setter, называемый setVARIABLE.
Единственный способ вызвать метод - использовать скобки. IE [object setNumber:3];
(Если у вас нет 0 или 1 параметров, спасибо HAS)
То, что вы хотите сделать, это использовать имя свойства, а не метод setter (или getter).
[object number];
Это вернет значение числа. Вы не можете прочитать свойства при доступе к ним через скобки, это только для чтения (только доступ к функции get).
object.number = 3;
Вот как бы вы указали номер свойства с помощью точечной нотации.
Когда ты написал object.setNumber = 3;
вы рассматривали setNumber как свойство, а это не так, это метод.
Подведем итоги
- методы могут использоваться только в скобочных обозначениях, а не в точечных
[object setNumber:3];
(Если у вас нет 0 или 1 параметров) - вы можете прочитать свойство только при обращении к нему через скобки
[object number]; //returns the value of number
- Вы можете прочитать и написать свойство при использовании его через точечную запись
object.number = 3;