3

重複の可能性:
Objective-C でクラスレベルのプロパティを宣言するにはどうすればよいですか?
Objective-C 2.0 ドット表記 - クラス メソッド?

Objective-C の @property 宣言では、クラス レベルのプロパティを指定できません。たとえば、これはできません...

@interface NSObject (MyExtension)

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

@end

...しかし、プロパティは実際には get/set メッセージの構文糖衣にすぎないことを読んだことを覚えています。

だから私はアイデアを持っていて、この通常のクラスレベルのメンバーを書きました...

@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];

もちろん、問題は...私は基本的にクラスレベルのプロパティを「発見」しただけですか(つまり、常にそこにありましたが、このようには使用されていません)?

(まあ、プロパティの構文ですが、それは、大量の括弧をネストするのではなく、チェーンの目的で私が求めていたものです。)

4

1 に答える 1

3

あなたは常にその言語で使用されてきた機能を説明しています。

おっしゃるように、プロパティはゲッターメソッドとセッターメソッドの単なる構文糖衣です。

@propertyと@synthesizeは、プロパティの実装に役立つだけで、ゲッターとセッターを自分で実装した場合と同じようにコンパイルされます。

言い換えれば、あなたの発見において、新しいことや予期しないことは何もありません、ごめんなさい。しかし、クラスレベルのプロパティが役立つ場合もありますが、いくつかの(ほとんど?)ObjCコーディングガイドラインでは、メッセージ構文を使用してクラスレベルのゲッターを呼び出すことを推奨しています。ドット付き表記を使用している場合、インテリセンスで表示されないのもそのためかもしれません。

于 2013-01-19T10:14:42.563 に答える