2017-09-22 21 views
1

私は以下の構造を持っています。 protocol Aに適合するclass Bを取得しました。 protocol Aは、-(instancetype)initWithInt:(int)countという指定された初期化子を定義します。私はclass Bで標準-(instancetype)initを実装し、それはまた、クラスBに実装されている指定イニシャライザを使用するように作る行くとき、私は警告を取得していますが指定されたイニシャライザは、 'super'で指定されたイニシャライザを呼び出す必要があります。

、「指定イニシャライザは 『スーパー』に関する指定イニシャライザを呼び出す必要があります"私の指定されたイニシャライザ(IMOはinitWithInt)は決してスーパーで指定された初期化子を呼び出すことはありません。

@protocol A 
{ 
(instancetype) init; 
(instancetype) initWithInt:(NSUInteger)count; 
} 

@interface B : NSObject <A> 

@implementation B 
- (instancetype) init { 
    return [self initWithInt:0]; 
} 
- (instancetype) initWithInt:(NSUInteger)count { 
    self = [super init]; 
    return self; 
} 

コンパイラがこの特定のケースでこの警告を省略する理由は何ですか?

+0

どういうのですか? – matt

+0

@matt質問セクションを更新しました。 – sramij

+0

このプロトコルをどのように使用しますか? – Willeke

答えて

1

Working with Protocolsから:

クラスインターフェースは、そのクラスに関連付けられたメソッドとプロパティを宣言する。対照的に、プロトコルは特定のクラスに依存しないメソッドとプロパティを宣言するために使用されます。

各クラスには、(継承された)指定初期化子があります。指定された初期化子をプロトコルで宣言することはできません。あなたはプロトコルで初期化子を宣言したい場合は、それが好きな実装:

- (instancetype)initWithInt:(NSUInteger)count { 
    self = [self initWithMyDesignatedInitializer]; 
    if (self) { 
     // do something with count 
    } 
    return self; 
} 

など:

- (instancetype)initWithInt:(NSUInteger)count { 
    return [self initWithMyDesignatedInitializer:count]; 
} 

そして、あなたのプロトコルでinitを宣言していない、それがNSObjectによって宣言されます。

編集:

それはプロトコルでの初期化子を宣言しても意味がありません。オブジェクトを割り当てて初期化するときは、オブジェクトのクラスを知っていて、このクラスの指定された初期化子を呼び出す必要があります。

編集2:

指定イニシャライザはクラスに固有と、このクラスで宣言されています。クラスのインスタンスを初期化できますが、プロトコルのインスタンスを初期化することはできません。プロトコルは、このオブジェクトのクラスを知らずにオブジェクトと話すことを可能にする。イニシャライザに関するドキュメント:Multiple Initializers and the Designated Initializer

+0

プロトコル内のメソッドにメソッドを実装することはできませんが、ここで何を話しているのか分かりません。さらに、合理的に言えば、プロトコルで指定された初期化子を定義することに何が問題なのか、それに対するあなたの議論は十分な推論を提供しない。 – sramij

+0

私はプロトコルが何であるか理解していないと思います。 [プロトコルの操作](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithProtocols/WorkingwithProtocols.html)を読んでください。 – Willeke

+0

なぜ賛成投票ですか?私は私の答えを取り除くべきですか? – Willeke

関連する問題