【问题标题】:Is there any way to add a generic type parameter to a protocol?有没有办法将泛型类型参数添加到协议中?
【发布时间】:2016-08-04 11:07:12
【问题描述】:

从 Xcode 7 开始,Objective-C 为类引入了泛型类型参数。有什么方法可以在 Objective C 协议中使用泛型?我还没有找到一种明显的方法来做到这一点,因为与@interface MyClass<ObjectType> 等效的协议已经被用于协议(例如@protocol MyProtocol<NSObject>)。

示例:我想像这样转换代码:

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

这样编码:

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

这对于常规类是可能的(例如,参见 NSArray)。

【问题讨论】:

  • 你能澄清你想要做什么吗?用一个例子更新你的问题。
  • 我猜你不能,因为泛型被添加到 Objective-C 中的类中以与 Swift 交互,而 Swift 中的协议没有泛型(它们有关联的类型)。

标签: objective-c generics


【解决方案1】:

如果我正确理解你的意思,你可以:

指定对象应该是 instance ofinherit from ObjectType 使用:

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

指定集合中的项目(NSArray、NSSet 等)应该是 ItemType 的实例(带有'__kindof' 的前缀也可以将其扩展到对象从 ItemType 继承)使用:

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

请注意,Objective-C 泛型旨在通过在未遵守指定类型时提供编译器警告来防止隐藏的错误。他们确实实际上在运行时强制指定类型。

【讨论】:

  • 对不起,我不明白答案。在第一个选项中,ObjectType 是从哪里获取的?没有这样的“类型”,甚至没有伪类型。在第二个示例(从 ItemType 继承)中,“CollectionType”是什么? “ItemType”在哪里定义或作为模板给出?为什么这甚至会编译?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2018-02-15
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多