2016-06-19 81 views
3

我想用默認初始化程序創建通用屬性的對象。我知道這可以通過在MyProtocol中添加一個init方法來實現。有沒有什麼辦法可以在目標C在iOS中初始化通用參數

接口

@interface CustomClass<__covariant T:id<MyProtocol>> : NSObject 

@property(nonatomic) T result; 

-(void) update; 

@end 

實施

#import "CustomClass.h" 

@implementation CustomClass 

-(void) update 
{ 
    //self.result = initialize result here 

    [self.result myMethod]; 
} 

@end 

回答

1

Objective-C中實現這一功能後期綁定和動態類型。你不需要模板(ooops,他們稱之爲泛型),也不需要編譯器綁定它。只需使用id即可。

@interface CustomClass : NSObject 
@property(nonatomic) id result; 
-(void) update; 
@end 

-(void) update 
{ 
    //self.result = initialize result here 
    [self.result myMethod]; 
} 

如果你想對無論什麼原因,類型的約束,只是使用的協議:

@protocol CustomProtocol 
- (void)myMethod; 
@end 

@interface CustomClass : NSObject 
@property(nonatomic) id<MyProtocol> result; 
-(void) update; 
@end 

-(void) update 
{ 
    //self.result = initialize result here 
    [self.result myMethod]; 
} 

討論的評論的主題後:

如果想要實例一個泛型類型,你不會在編譯時做到這一點,而只是在運行時將類型傳遞給初始值設定項。

而不是...:

var concrete = CustomClass<Concrete>() 

...你寫的:

CustomClass *concrete = [[CustomClass alloc] initForType:[Concrete class]]; 

我個人更喜歡新的分配器,但是這是另一個討論。您也可以將類型名稱作爲字符串傳遞。我個人也不喜歡那樣。 :-)

的初始化看起來是這樣的:

- (instancetype)initForType:(Class)type 
{ 
    if((self = [super init]) 
    { 
    self.result = [type new]; 
    } 
    return self; 
} 
+0

但是我怎樣才能初始化更新方法的結果? – Gulshan

+0

?我真的不知道,你想分配什麼。您應該分配一個實例,而不是一個類型。只需使用setter在那裏放置一個值。如果'CustomClass'被初始化,結果應該是private還是初始化? –

+0

我想初始化CustomClass初始化結果。我知道我可以初始化它並將它傳遞給CustomClass。我想知道我是否可以在CustomClass中執行初始化結果 – Gulshan

0

在Objective-C輕量級泛型是一個純粹的編譯時構建的類型檢查,以幫助。它們在類型檢查後被擦除,並且不存在於編譯的代碼中。運行時沒有T。你不能寫任何需要知道什麼是T的代碼。