1

operator ->Objective-Cに問題があります。

ObjC クラスに C++ ラッパーが必要です。

だから私は自分のクラスを作成しました:

@interface User : NSObject

@property (nonatomic, copy) NSString *name;

@end

そしてラッパークラスも:

class UserWrapper {
    User *_user;
    //  ctors, accessors, etc.

    operator User *(){
        return _user;
    }

    User *operator->(){
        return _user;
    }
};

それを介してバッキングオブジェクトにアクセスしようとすると、operator User*うまくいきます:

UserWrapper wrapper([User new]);
[wrapper setName:@"alex"];
NSLog(@"%@", [wrapper name]);

しかし、このオブジェクトにアクセスしようとするとoperator ->

UserWrapper wrapper([User new]);
[wrapper setName:@"alex"];
NSLog(@"%@", wrapper->name);

次のエラーがあります。

Property 'name' found on object of type 'User *'; did you mean to access it with the "." operator?

の理解operator ->が間違っているようです。

誰かが私が間違っていることと、この問題を修正する方法について説明していますか?

バッキングオブジェクトに直接アクセスする別の方法があるのではないでしょうか?

4

1 に答える 1

5

C、C++、および Objective-C では、 membera->bを逆参照aしてアクセスすることを意味しますb。C および C++ では、 と同じですが、より簡単です(*a).b

したがって、 というメンバーがあった場合、の実装は->正しいでしょうが、そうではありません。他のコードをまったく記述していない場合、インスタンス変数と呼ばれるセッターとゲッターとand があります。Objective-C では、この構文は次のとおりです。UsernameUser_namenamesetName:

value = object.name;

次の構文と同等です。

value = [object name];

つまり、getter を呼び出すメソッド ディスパッチとしてコンパイルされます。同様に、これは:

object.name = value;

次と同等です。

[object setName:value];

つまり、setter を呼び出すメソッド ディスパッチとしてコンパイルされます。どちらの場合も、インスタンス変数にアクセスしていません。どちらの場合も、セッターとゲッターを呼び出しています。User必要に応じて、インスタンス変数 backing を持たないように実装nameしたり、完全に別の場所に配置したり、他の形式との間で変換したりできます。

手がかりは、以下が有効な Objective C 構文であることです。

User *object = [[User alloc] init];
object.name;

C および C++ では、ドット演算子はポインターでは機能しません。

Objective-C でメンバー変数への直接アクセスを公開することは、まったく普通のことではありません。適切にラッピングするには、プロパティごとに実際のゲッターとセッターを記述する必要があります。ハックのアプローチは次のようになります。

@interface User: NSObject
{
    @public
       NSString *name;
}

@property (nonatomic, copy) NSString *name;
@end

[...]

@implementation User
@synthesize name;
@end

どちらが:

  • インスタンス変数を作成しますname
  • とも呼ばれるプロパティのセッターとゲッターを作成しますname
  • セッターとゲッターがプロパティのインスタンス変数を使用していることを確認します。
  • 経由で直接アクセスできるようにインスタンス変数も公開します->

ただし、インスタンス変数を直接操作することは、設計と保守性の観点から、またキー値監視などの他の Objective-C 機能を使用できるようにするという点で、非常に悪い考えです。

于 2013-06-05T05:20:25.757 に答える