2016-02-18 33 views
0

例子是在Objective-C泛型i從1類傳遞類型的我想要做另一

@interface A<ObjectType> : NSObject 
@end 
@interface B<ObjectType> : NSObject 
- (void)doSomething:(ObjectType)obj; 
@end 
@implementation B 
- (void)doSomething:(id)obj { 
    **A<ObjectType> *a = [[A alloc] init];** 
    [a addObject:obj]; 
} 
@end 

基本上我想A到用相同類型被分配爲B與分配。

**內的行不會編譯。什麼是正確的語法來做這樣的事情?

+0

Obj-C不熟悉w /泛型,但需要看一看。檢查這篇文章表明你在實現中的通用括號內缺少一個指針:'A * a' http://drekka.ghost.io/objective-c-generics/ – mc01

回答

3

的Objective-C確實有仿製藥,蘋果推出的東西,他們長期輕型泛型,你可以閱讀「輕量級」爲「假」。

這裏是他們做什麼蘋果自己的說法:

允許您指定的集合類,如NSArray的,NSSet中,和NSDictionary的類型信息。類型信息在您從Objective-C進行橋接並簡化您必須編寫的代碼時改進了Swift訪問。

注意「改進了Swift訪問」和缺少「改進Objective-C」。這些輕量級泛型實質上是Swift編譯器在導入Objective-C類型時的註釋。在Objective-C方面,維持泛型不變量在很大程度上是程序員的責任。

您可以使用@interface中的輕量級通用註釋(a)和(b)在聲明其類型具有輕量級通用註釋的變量時。您不能以其他方式使用註釋,尤其是您不會在上述(b)以外的@implementation中使用它們。在@implementation中使用輕量級通用註釋@interface而不是使用註釋中的「類型參數」來使用id類型 - 正如您使用doSomething:方法所做的那樣。

最新的Xcode/Clang將在Objective-C中提供一些輕型通用註釋的檢查,但它是有限的,並且絕不應被視爲通用條件被檢查的保證。總之,除非你打算與Objective-C中的輕量級泛型註釋互動,否則它並不會給你帶來一般意義上的「泛型」(即參數泛型)。

毫無疑問不是你想聽到的,但HTH

-1

這對你適合嗎?

@protocol ObjectType <NSObject> 

- (void)addObject:(id)obj; 


@end 

@interface A : NSObject <ObjectType> 


@end 

@implementation A 

- (void)addObject:(id)obj { 

} 

@end 
@interface B : NSObject <ObjectType> 


- (void)doSomething:(id<ObjectType>)obj; 
@end 
@implementation B 

- (void)addObject:(id)obj { 

} 

- (void)doSomething:(id)obj { 
    id<ObjectType> a = [[A alloc] init]; 
    [a addObject:obj]; 
} 

@end 
+0

你的答案使用Objective- C *協議*,而不是OP所要求的Objective-C(僞)*泛型*。 – CRD

相關問題