采用现代Objective-C (2)

Properties

一个public或private的Objective-C属性使用@property语法声明的。

    @property (readonly, getter=isBlue) BOOL blue;

属性持有着一个对象的状态。他们反映对象的本质属性和其他对象的关系。Properties提供一个安全、方便的方式来定义这些属性,而无需编写一组自定义访问器方法(虽然属性允许定制的getter和setter,如果需要的话)。


使用属性而不是实例变量在尽可能多的地方提供了许多好处:

  • 自动合成getters和setters。当你声明一个属性,默认情况下为你创建getter和setter方法。
  • 更好的意图声明一组方法。因为访问器方法的命名约定方便,很明显getter和setter方法是做什么的。
  • property关键字表示关于行为的额外信息。属性提供潜在的声明的属性像assign(vs copu),weak,atomic(vs nonatomic),等等。

属性方法遵循一个简单的命名约定。getter属性的名称(例如,date),setter属性在名称前加前缀,按驼峰式命名书写(例如,setDate)。Boolean属性的命名约定是声明他们的getter方法以'is'开头。

    @property (readonly, getter=isBlue) BOOL blue;

因此,以下所有调用方式都可以正常工作:

    if(color.blue){}
    if(color.isBlue){}
    if([color isBlue]){}

在决定什么可能是一个属性时,记住,如下不是属性:

  • init方法
  • copy方法,mutableCopy方法
  • 一个类的工厂方法
  • 一个初始化一个动作并返回BOOL值的方法
  • 一个明确改变内部状态对getter有副作用的方法

此外,考虑以下的规则集当在你的代码中定义属性时:

  • 一个读/写属性有两个访问器方法。setter接受一个参数什么也不返回,getter不接受参数并返回一个值。可以用readwrite关键字设置这个属性。
  • 一个只读属性有一个访问器方法,getter不接受参数并返回一个值。可以使用readonly关键字设置。
  • getter应该幂等的(如果一个getter方法调用了两次,那么第二次结果应该和第一次是相同的)。
    但是,每次geeter被调用返回结果是可接受的。

怎样适配

定义一组方法,有资格被转换成属性,诸如此类的:

    - (NSColor *)backgroundColor;
    - (void)setBackgroundColor:(NSColor *)color;

用@property语法和其他合适的关键字定义他们:

    @property (copy) NSColor *backgroundColor;

更多关于property关键字和其他的信息,请看“Encapsulating Data”

或者,您可以在Xcode使用现代objective-c变换器自动进行转换您的代码。更多信息请看使用Xcode重构你的代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容