【发布时间】: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