2017-09-22 50 views
1

我有以下結構。 我得到了class B,它符合protocol Aprotocol A定義了一個指定的初始化程序,即-(instancetype)initWithInt:(int)count指定的初始化程序應該只在'super'上調用指定的初始化程序當使用協議時?

但是,當我去執行標準-(instancetype)initclass B並使其使用指定初始化程序,它也在類B中實現,我得到警告「指定的初始化程序應該只調用指定的初始化程序'超' 「,而我指定的初始化程序(其中IMO爲initWithInt)從不會在super上調用任何指定的初始化程序。

@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

相關問題