在 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的类属性