2016-02-02 22 views
10

Xcode 7'den itibaren Objective-C, sınıflar için jenerik tip parametrelerini tanıttı. Nesnel C protokolleri ile jenerik kullanmak için herhangi bir yolu var mı? Bunu yapmak için açık bir yol bulamadım çünkü @interface MyClass<ObjectType> eşdeğeri protokoller için zaten alınmış (ör. @protocol MyProtocol<NSObject>).Bir protokole jenerik tip parametresi eklemenin bir yolu var mı?

Örnek: Böyle bir kod dönüştürmek istiyoruz:

@protocol MYObjectContainer 
- (id)objectAtIndex:(NSUInteger)index; 
@end 

böyle kodlamak için: (örneğin bkz, NSArray) düzenli sınıfları ile mümkündür

@protocol MYObjectContainer 
- (ObjectType)objectAtIndex:(NSUInteger)index; 
@end 

.

+0

Ne yapmaya çalıştığınızı açıklayabilir misiniz? Sorunuzu bir örnekle güncelleyin. – rmaddy

+0

tamam, bir, bir –

+2

ek ekledi Benim tahmin edemezsiniz, çünkü Objective-C'deki sınıflara Swift ile arabirim eklemek için jenerikler eklendi ve Swift'deki protokoller jeneriklere sahip değil (bunun yerine ilişkili türlere sahipler). – newacct

cevap

2

Doğru siz yapabilirsiniz dediğini anlamak:

@protocol MYObjectContainer 
- (__kindof ObjectType *)objectAtIndex:(NSUInteger)index; 
@end 

belirtin: kullanarak

nesne ya bir ait örneği veya objectType gelen devralır ya olması gerektiğini belirtin (NSArray, NSSet, vb.) koleksiyonundaki öğesinin, ItemType öğesinin bir örneği olması gerekir ('__kindof' ile önek, bunu ayrıca kullanılarak ItemType gelen heriting): Amaç-Cı jenerik belirli bir türü yapıştırılmayan derleyici uyarılar sağlayarak gizli hataları önlemek için tasarlanmış olduğu

@protocol MYObjectContainer 
- (CollectionType <ItemType *> *)objectAtIndex:(NSUInteger)index; 
@end 

not edin. 'u aslında çalışma zamanında belirtilen türlere zorlamazlar.

İlgili konular