在 Objective-C 中的类属性上使用单词“set”

Posted

技术标签:

【中文标题】在 Objective-C 中的类属性上使用单词“set”【英文标题】:Using the word 'set' on a class's property in Objective-C 【发布时间】:2017-10-16 19:00:48 【问题描述】:

我正在学习 ios 开发,并选择在 Objective-C 和 Swift 之间来回切换以注意差异或相似之处。在学习 Objective-C 教程时,我注意到 Xcode 自动完成功能允许我的教程中的代码如下:

taskField = [[UITextField alloc] initWithFrame:fieldFrame];
    [taskField setBorderStyle:UITextBorderStyleRoundedRect];
    [taskField setPlaceholder:@"Type a task, tap Insert"];

我决定查找 UITextField 参考页面,将参考页面的语言更改为 Objective-C,并注意到属性通常不使用前置文本“set”。用 Objective-C 编写时,是否应该始终为属性使用前置文本“set”?

提前谢谢你。

【问题讨论】:

Naming conventions for BOOL Obj-C 2 properties?的可能重复 【参考方案1】:

简短的回答是在这种情况下以下两行是等效的:

taskField.borderStyle = UITextBorderStyleRoundedRect;
[taskField setBorderStyle:UITextBorderStyleRoundedRect];

set 是“setter”方法上的标准前缀——如果您是 ObjC 新手,这可能会有点令人困惑。这里的实际属性 name 是例如borderStyle,如果你使用点语法设置器,你会写taskField.borderStyle = ...。如果您使用消息符号(括号)调用 setter,那么您将使用 setBorderStyle: 显式。

以下是解释这一点的历史:早在 10 多年前,ObjC 没有任何已声明的正式属性,也没有用于访问它们的“点”语法。您将创建一个“私有”实例变量,然后为该值编写惯用的 getter 和 setter。按照惯例,setter 以“set”为前缀,而 getter 没有前缀(它只是“属性名称”)。所有对该值的访问,无论是获取还是设置,都是使用括号表示法完成的。通过一些中间演变快进,现在方便的@property 声明将为您自动合成所有您曾经必须编写的曾经繁琐的样板代码。方法综合命名规则是自动的并遵循早期的约定。今天的大多数文档将演示使用点表示法的属性访问,但 getter 和 setter 方法是自动生成的,并且仍然可以直接使用。

简而言之,按照惯例,您现在通常会写成taskField.borderStyle = ...,但您也可以调用[taskField setBorderStyle:...]。前者本质上调用了后者的方法,两者在语义上是相同的。

【讨论】:

非常感谢您为改进您的理论而不断进行的编辑,并且背景信息添加了更多背景信息,这对我自己的个人学习过程非常有帮助。【参考方案2】:

您通过访问器方法访问或设置对象的属性:

NSString *firstName = [somePerson       firstName];
[somePerson setFirstName:@"Johnny"];

默认情况下,编译器会自动为您合成这些访问器方法,因此您无需执行任何操作,只需在类接口中使用 @property 声明属性。

合成方法遵循特定的命名约定:

用于访问值的方法(getter 方法)与属性同名。 名为 firstName 的属性的 getter 方法也将称为 firstName。

用于设置值的方法(setter 方法)以单词“set”开头,然后使用大写的属性名称。 名为 firstName 的属性的 setter 方法将被称为 setFirstName:。

如果您不想通过 setter 方法更改属性,可以在属性声明中添加一个属性以指定它应该是只读的:

@property (readonly) NSString *fullName;

详情见此链接Use Accessor Methods to Get or Set Property Values

【讨论】:

以上是关于在 Objective-C 中的类属性上使用单词“set”的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 令人兴奋,但Objective-C也有小改进--Objective-C的类属性

在 Objective-C 中,如何设置属性的属性,即设置为另一个类属性的类?

如何为objective-C中的类中的数组分配内存?

带有指针的属性与objective-c中的属性之间的差异

Objective-C中的类目,延展,协议

Objective-C中的类目(Category),延展(Extension)