【问题标题】:Is this a valid way to create class-level properties (i.e. dot-syntax) in Objective-C? [duplicate]这是在 Objective-C 中创建类级属性(即点语法)的有效方法吗? [复制]
【发布时间】:2013-01-19 10:09:41
【问题描述】:

可能重复:
How do I declare class-level properties in Objective-C?
Objective-C 2.0 dot notation - Class methods?

Objective-C 的@property 声明不允许您指定类级别的属性。例如,你不能这样做......

@interface NSObject (MyExtension)

    + @property (nonatomic, copy) NSString * className;

@end

...但我记得我读到过,属性实际上只是获取/设置消息的语法糖,所以当您键入 something.foo 时,您实际上只是发送 [something foo] 或 [something setFoo:newFooVal ] 消息。

于是我有了一个想法,就写了这个普通的类级成员……

@interface NSObject (MyExtension)

    + (NSString *) className;

@end

在“m”文件中,添加了这个(再次,完全正常)...

#import "IS_NSObject.h"

@implementation NSObject (MyExtension)

  + (NSString *) className
    {
        return NSStringFromClass([self class]);
    }

@end

...果然,要获得任何类名的字符串表示,我现在可以这样做...

NSString * holderForClassName = UICollectionView.className;

瞧!一流的属性!甚至没有编译器警告!

实际上,唯一缺少的是代码完成/智能感知中的建议。但是如果你这样输入它当然会......

NSString * holderForClassName = [UICollectionView className];

所以,当然,问题是......我基本上只是“发现”(即它一直在那里,但它没有像这样使用)一个类级别的属性吗?

(嗯,好的,属性语法,但这就是我所追求的链接目的,而不是嵌套大量的括号。)

【问题讨论】:

  • 不,你发现了类方法。方法和属性有什么区别?当您合成一个属性时,除了编译器会为您完成大部分工作,而且它们几乎专门用于获取/设置实例变量。
  • 不是重复的,因为那个人在问怎么做,答案说你不能。我正在提出实际上如何在类、ala(伪)类属性上使用点语法。
  • 哈哈……好吧,好吧……我明白了!这是一件邪恶的事情!尽管如此,我还是喜欢它来处理这些事情,所以无论如何我都会使用它。 :)
  • 我认为只有使用点符号调用零参数方法才是邪恶的;我不认为那个问题的回答者(?!?)说在类级别的 getter/setter 方法上使用点表示法是邪恶的。

标签: objective-c properties class-members


【解决方案1】:

您正在描述该语言中一直存在的功能。

正如您提到的,属性只是 getter 方法和 setter 方法的语法糖。

@property 和 @synthesize 只是帮助您实现属性,它们编译成与您自己实现 getter 和 setter 相同的东西。

换句话说,您的发现没有什么新的或意外的,抱歉。但是类级别的属性有时会有所帮助,尽管我认为一些(大多数?)ObjC 编码指南建议使用消息语法调用类级别的 getter。这也可能是为什么当您使用点分符号时它不会出现在智能感知中。

【讨论】:

  • 是的...并没有真正看到属性和 get/set 方法之间的区别。如果有的话,它们只是一种方便,可确保您的方法遵循键值编码并在您以声明方式合成它们时提供帮助。尽管如此,我还是喜欢这个,因为它允许我使用点语法而不是括号轻松地链接事物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2013-02-23
  • 2017-01-26
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多