Ошибка "Свойство 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 как свойство, а это не так, это метод.

Подведем итоги

  1. методы могут использоваться только в скобочных обозначениях, а не в точечных [object setNumber:3]; (Если у вас нет 0 или 1 параметров)
  2. вы можете прочитать свойство только при обращении к нему через скобки [object number]; //returns the value of number
  3. Вы можете прочитать и написать свойство при использовании его через точечную запись object.number = 3;
Другие вопросы по тегам