目标c中的轻量级泛型

时间:2015-06-18 08:04:15

标签: objective-c xcode generics xcode7

我正在尝试使用轻量级泛型实现堆栈类。 但代码无法编译,因为Xcode无法找到ObjectType

的定义
@implementation Stack
- (ObjectType)popObject     !!!!!!!!!Expected a type
{
    return self.allObjects.firstObject;
}
@end

这很奇怪,因为标头声明不会产生任何错误。

@interface Stack<__covariant ObjectType> : NSObject
- (ObjectType)popObject;
@property (nonatomic, readonly) NSArray<ObjectType> *allObjects;
@end

我可以通过将ObjectType更改为id来使其发挥作用。 有没有更好的方法来解决错误?

2 个答案:

答案 0 :(得分:13)

Objective-C泛型确实是轻量级的,并且被添加以改善与Swift的互操作性,而不是使Objective-C代码更安全。与可空性类似,将泛型视为注释界面的一种方式,而不是改变实现的理由。

在实施中将ObjectType更改为id 是最好的方法。

进一步阅读:article on Objective C Generics。如果您想了解__covariant,请阅读bob对该文章的评论。

答案 1 :(得分:1)

只有推定,但是,如果用ObjectType替换id,可能你使用的不是指针类型吗?

我的意思是,如果您@interface ObjectType某处Stack而不是ObjectType*,则<...>大括号和方法返回类型<{1}}

如果这不是问题,抱歉误导