Ошибка Свойство setVariableName не найдено с использованием записи через точку для установки свойства

Я только начал изучать 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, и почему я могу использовать для этого только квадратные скобки?


person Striving    schedule 14.04.2014    source источник
comment
используйте 1_   -  person Bryan Chen    schedule 14.04.2014
comment
Эквивалентный оператор с точечной нотацией: object.number = 4, а не object.setNumber = 4. Точечная нотация использует имя самого свойства, а не имя установщика.   -  person rdelmar    schedule 14.04.2014
comment
Вы можете использовать точечную нотацию всякий раз, когда у вас есть метод, который принимает 0 или 1 параметр. Проблема с вашим кодом (почему вы получаете предупреждение) заключается в том, что вы не должны не использовать set в точечной нотации. Это почему? Компилятор генерирует обычный вызов метода из записи через точку. Итак, если вы пишете object.number = 4;, компилятор генерирует [object setNumber:4];. Вот почему это не работает, когда вы пишете object.setNumber = 4;, потому что компилятор генерирует [object setSetNumber:4];, а этого метода не существует.   -  person HAS    schedule 14.04.2014


Ответы (2)


Вы получаете эту ошибку, потому что свойство называется number, а не setNumber. В языках ООП принято создавать методы, которые обращаются к данным объекта, используя «сеттеры» и «геттеры». Свойство в Objective-C 2.0 синтезирует этот процесс и автоматически генерирует сеттеры и геттеры. Если вы зайдете в MyClass.m и введете - setN, вы увидите setNumber, предложенный Xcode. Это потому, что вы можете реализовать свои сеттеры и геттеры самостоятельно, чтобы настроить их поведение, или оставить поведение по умолчанию, просто установив значение или получив значение.

Кроме того, свойства автоматически генерируют объявление переменной как _variableName. Например, поведение вашего свойства по умолчанию будет таким:

- (void) setNumber:(int)number {
    _number = number
}

- (int) getNumber {
    return _number;
}

Определение того, следует ли вам использовать один над другим, действительно сводится к согласованности. Чтобы обеспечить согласованность в командах, должно быть руководство по стилю. Возьмите, например, NY Times. Они строго ограничивают точечную нотацию свойствами и скобками для не свойственных методов (т. е. сеттеров и геттеров).

person Chris    schedule 14.04.2014

Вы путаете методы и свойства.

Когда вы создаете свойство, да, оно создает метод установки с именем setVARIABLE.

Единственный способ вызвать метод — использовать скобки. IE [object setNumber:3]; (если у вас нет 0 или 1 параметров, спасибо HAS)

Что вы хотите сделать, так это использовать имя свойства, а не метод установки (или получения).

[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;
person Michael King    schedule 14.04.2014
comment
Ваша переменная терминология отключена. [object number] — это сообщение, отправляемое точно так же, как [object doThatThingYouDo]. Это не чтение переменной; выполняется метод; его возвращаемое значение может быть значением переменной экземпляра, но это не является неотъемлемым. Также не является object.number прямым доступом к переменной. Это синтаксический сахар для, опять же, (отправки сообщения, которая приводит к) вызову метода. Единственный способ вызвать метод — использовать скобки. Таким образом, IE [object setNumber:3]; неверен. - person jscs; 14.04.2014
comment
Извините за отсутствие правильной терминологии. Я обновил свой ответ, включив в него правильную терминологию. - person Michael King; 14.04.2014