2

init 以外の場所から設定したくないインスタンス変数 apiEndpoint があり、それをクラスに対してプライベートにしたいだけです。プロパティではなくインスタンス変数を使用しても問題ありませんか?

ApiWrapper.h

#import <Foundation/Foundation.h>

@interface ApiWrapper : NSObject
{
    NSString *apiEndpoint;
}

- (void) initWithApiEndpoint:(NSString *) newApiEndpoint;


+ (NSString *)getApiEndpoint:(NSString *) storeUrl;
+ (NSString *)getApiEndpointWithoutIndexDotPHP:(NSString *) storeUrl;
@end

ApiWrapper.m

#import "ApiWrapper.h"


@implementation ApiWrapper
- (void) initWithApiEndpoint:(NSString *) newApiEndpoint;
{
    apiEndpoint = newApiEndpoint;
}
+ (NSString *)getApiEndpoint:(NSString *) storeUrl
{
    if (![storeUrl hasPrefix:@"http://"] && ![storeUrl hasPrefix:@"https://"])
    {
        NSLog(@"%@ missing http", storeUrl);
    }

    return nil;
}

+ (NSString *)getApiEndpointWithoutIndexDotPHP:(NSString *) storeUrl
{

}

@end
4

3 に答える 3

4

はい、ivar を使用しても問題ありません。ただし、プロパティの優れている点は、getter と setter を作成することです。これは、変数値を読み書きするだけでなく、オブジェクト保持管理、スレッドセーフな読み書きなどを含めることができます。

クラスの .m ファイルの匿名クラス拡張子で宣言することにより、「プライベート プロパティ」を作成する方法があります。init および dealloc メソッドでプロパティをサポートする ivar を引き続き使用する必要があることに注意してください。コードは次のようになります。

#import "ApiWrapper.h"

@interface ApiWrapper ()
@property (strong,nonatomic) NSString* apiEndpoint;

@end

@implementation ApiWrapper

- (id) initWithApiEndpoint:(NSString *) newApiEndpoint;
{
    self = [super init]
    if ( self ) {
        _apiEndpoint = newApiEndpoint;
    }

    return self;
}
于 2013-01-28T03:19:43.737 に答える
2

ここで私の答えを参照してください:
インターフェイスで変数を宣言するか、Objective-Cアークでプロパティを使用する必要がありますか?

要約バージョン:

  • 可能な限り、プロパティを宣言します
  • iVarsを個別に宣言しないでください
  • @synthesizeしないでください
  • .hファイルでできるだけ少ないプロパティを見つけます
  • .mファイルのクラス拡張子でできるだけ多くのプロパティを見つけます

私が追加する他の唯一のポイント-何らかの理由でiVarsを使用する場合、コードを読み取るときに何をしているかがわかるように、_leading_underscoresなどの明確な規則を使用してください

于 2013-01-28T03:48:50.160 に答える
2

プライベート クラス拡張でプライベート プロパティを使用するというクレアウェアの提案に同意します。別の方法として、他のクラスがそれを参照できるようにしたいが、変更したくない場合は、それを読み取り専用プロパティとして定義します。

ApiWrapper.h で:

#import <Foundation/Foundation.h>

@interface ApiWrapper : NSObject

@property (nonatomic, strong, readonly) NSString *apiEndpoint;

- (id) initWithApiEndpoint:(NSString *) newApiEndpoint;

+ (NSString *)getApiEndpoint:(NSString *) storeUrl;
+ (NSString *)getApiEndpointWithoutIndexDotPHP:(NSString *) storeUrl;

@end

そして ApiWrapper.m で:

#import "ApiWrapper.h"

@interface ApiWrapper ()

@property (nonatomic, strong) NSString *apiEndpoint;

@end

@implementation ApiWrapper

- (id) initWithApiEndpoint:(NSString *) newApiEndpoint;
{
    self = [super alloc];
    if (self)
    {
        _apiEndpoint = newApiEndpoint;
    }

    return self;
}

@end

2 つの注意事項:

  1. メソッドに戻り値の型があってはinit...なりません。メソッドは常に初期化されたオブジェクトを返す必要があります。voidinit

  2. プロパティを使用する場合は、初期化メソッドと dealloc でアクセサー メソッドを使用しないことを忘れないでください


明らかに、本当に ivar を使用したい場合 (プロパティを使用して目的を達成できることに同意します)、単純に次のようにします。

ApiWrapper.h:

#import <Foundation/Foundation.h>

@interface ApiWrapper : NSObject

- (id) initWithApiEndpoint:(NSString *) newApiEndpoint;

+ (NSString *)getApiEndpoint:(NSString *) storeUrl;
+ (NSString *)getApiEndpointWithoutIndexDotPHP:(NSString *) storeUrl;

@end

そして ApiWrapper.m で:

#import "ApiWrapper.h"

@interface ApiWrapper ()
{
    NSString *apiEndpoint;
}
@end

@implementation ApiWrapper

- (id) initWithApiEndpoint:(NSString *) newApiEndpoint;
{
    self = [super alloc];
    if (self)
    {
        apiEndpoint = newApiEndpoint;
    }

    return self;
}

@end
于 2013-01-28T03:32:48.300 に答える