【问题标题】:Error "Property setVariableName not found" using dot notation to set property使用点表示法设置属性时出现错误“找不到属性 setVariableName”
【发布时间】:2014-04-14 04:04:08
【问题描述】:

我刚开始学习 Objective-C,我不确定何时使用点表示法与方括号。我知道有人问过here 类似的问题,但我仍然没有真正理解其中的区别。我读过[myObject doSomething] 和myObject.doSomething 是等价的。但我不确定的是,当我使用 @property 生成一个方法时,它会自动生成一个我只能与方括号一起使用的 setter 方法。

// 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 时会收到错误消息,为什么我只能使用方括号呢?

【问题讨论】:

  • 使用object.number = 4
  • 点表示法的等效语句是object.number = 4,而不是object.setNumber = 4。点表示法使用属性本身的名称,而不是setter的名称。
  • 只要您有一个采用 0 或 1 个参数的方法,您就可以使用点表示法。您的代码的问题是(为什么会收到警告)您必须不在点表示法中使用set。这是为什么?编译器从点符号生成一个正常的方法调用。所以如果你写object.number = 4;,编译器会生成[object setNumber:4];。这就是为什么当你写object.setNumber = 4;时它不起作用的原因,因为编译器生成[object setSetNumber:4];并且该方法不存在。

标签: objective-c syntax accessor declared-property


【解决方案1】:

您收到该错误是因为该属性名为 number 而不是 setNumber。在 OOP 语言中,创建使用“setter”和“getter”访问对象数据的方法很常见。 Objective-C 2.0 中的一个属性综合了这个过程并自动生成了 setter 和 getter。如果您进入 MyClass.m 并输入 - setN,您将看到 Xcode 建议的 setNumber。这是因为您可以自己实现 setter 和 getter 来自定义它们的行为,或者保留简单地设置值或获取值的默认行为。

此外,属性会自动生成变量声明为_variableName 例如,您的属性的默认行为是:

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

- (int) getNumber {
    return _number;
}

确定是否应该使用其中一种,实际上归结为一致性。为了确保团队的一致性,应该有一个风格指南。以NY Times 为例。它们将点表示法严格限制为非属性方法(即 setter 和 getter)的属性和括号。

【讨论】:

    【解决方案2】:

    您混淆了方法和属性。

    当您创建一个属性时,是的,它会创建一个名为 setVARIABLE 的 setter 方法。

    调用方法的唯一方法是使用方括号表示法。 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;读写

    【讨论】:

    • 您的“变量”术语已关闭。 [object number] 是一个类似[object doThatThingYouDo] 的消息发送。这不是“读取变量”;正在运行一个方法;它的返回值可能是实例变量的值,但这不是固有的。 object.number 也不是直接访问变量。再次,它是方法调用的语法糖(消息发送导致)。 “调用方法的唯一方法是使用括号表示法。IE [object setNumber:3];”因此不正确。
    • 抱歉,缺少正确的术语。我更新了我的答案以包含正确的术语。
    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2021-01-16
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多