xcode 7类型参数不能应用于非参数化类

时间:2015-09-24 20:39:08

标签: ios objective-c xcode

我今天在我的xcode项目中收到此错误...我以前从未得到过这个错误。自上次成功构建以来我唯一的改变就是我导入了iAD框架(我在今天早上尝试进行新构建之前做了这个,所以我不确定它是否有任何关系尽管如此。我怀疑它。)所有问题都与NSSet / NSArray / NSDictionary有关,并且都包含在UIKit的UIEvent和CoreImage的CIImage中。如果有人知道这里会发生什么,我会很感激输入。

编辑:我忘了提到具体的错误。他们在这里:

"类型参数不能应用于非参数化的类' NSSet'"",

"类型参数可以应用于非参数化的类' NSArray'"",

"类型参数可以应用于非参数化的类' NSDictionary'"

编辑2:我没有意识到应用程序商店自动将xcode从6.4更新到7.0,所以我改为标题以反映正确的xcode版本。

这是UIEvent.h中发生的事情(第50,51,52,53,56,59行):

- (nullable NSSet <UITouch *> *)allTouches;
- (nullable NSSet <UITouch *> *)touchesForWindow:(UIWindow *)window;
- (nullable NSSet <UITouch *> *)touchesForView:(UIView *)view;
- (nullable NSSet <UITouch *> *)touchesForGestureRecognizer:        (UIGestureRecognizer *)gesture NS_AVAILABLE_IOS(3_2);

// An array of auxiliary UITouch’s for the touch events that did not get delivered for a given main touch. This also includes an auxiliary version of the main touch itself.
- (nullable NSArray <UITouch *> *)coalescedTouchesForTouch:(UITouch *)touch NS_AVAILABLE_IOS(9_0);

// An array of auxiliary UITouch’s for touch events that are predicted to occur for a given main touch. These predictions may not exactly match the real behavior of the touch as it moves, so they should be interpreted as an estimate.

这里发生在UIResponder.h中的地方(第31-34行):

// Generally, all responders which do custom touch handling should override all four of these methods.
// Your responder will receive either touchesEnded:withEvent: or touchesCancelled:withEvent: for each
// touch it is handling (those touches it received in touchesBegan:withEvent:).
// *** You must handle cancelled touches to ensure correct behavior in your application.  Failure to
// do so is very likely to lead to incorrect behavior or crashes.
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;

也发生在UIREsponder.h(第79行):

@interface UIResponder (UIResponderKeyCommands)
@property (nullable,nonatomic,readonly) NSArray<UIKeyCommand *>     *keyCommands NS_AVAILABLE_IOS(7_0); // returns an array of UIKeyCommand objects<
@end

这里是CIImage.h第97和102行中发生的地方:

/* Creates a new image from the contents of 'image'. */
+ (CIImage *)imageWithCGImage:(CGImageRef)image;
+ (CIImage *)imageWithCGImage:(CGImageRef)image
                  options:(nullable CI_DICTIONARY(NSString*,id) *)options;

/* Creates a new image from the contents of 'layer'. */
+ (CIImage *)imageWithCGLayer:(CGLayerRef)layer NS_DEPRECATED_MAC(10_4,10_11);
+ (CIImage *)imageWithCGLayer:(CGLayerRef)layer
                  options:(nullable CI_DICTIONARY(NSString*,id) *)options NS_DEPRECATED_MAC(10_4,10_11);

3 个答案:

答案 0 :(得分:1)

我也遇到了这个错误,我只是将@class更改为#import用于有问题的类,然后清理并构建并且它再次正常...我认为有些错误...有问题的类是我自己的参数化类

答案 1 :(得分:0)

我已经重新审视了这个问题,似乎其他人已经在不同的线程中解决了这个问题。在github上。

问题是我在项目中包含的Parse / Bolts框架已经过时,我将它们保存在我的项目中。我在项目中使用的版本与xcode 7冲突。

删除所有本地副本并将“pod'Parse'”添加到我的pod文件并运行“pod install”后,此特定问题已得到解决。

对于有相关问题的任何人,您应该尝试更新项目中剩余的旧依赖项,并查看为您解决此问题的方法。

以下是一些更详细讨论此问题的相关主题:

Type arguments cannot be applied to non-parameterized class BFTask in PFAnalytics and PFObject

https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/297

答案 2 :(得分:0)

我知道这是一个古老的问题,但是由于没有人真正尝试回答这个问题,所以我可以解决。

错误消息是关于类型参数的,例如 UIEvent.h <UITouch *>的声明中的allTouches,它告诉您期望从中获得一组触摸这种方法。但是,编译器在抱怨,因为它无法在 NSSet.h 中找到任何此类相应的声明。

所以 NSSet.h 中的第一行可能看起来像这样(在Xcode 6中):

@interface NSSet : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>

但是它应该看起来像这样(以使该特定警告消失):

@interface NSSet<UITouch> : NSObject <NSCopying, NSMutableCopying ...

但是嘿,集合可以包含触摸以外的内容,因此它实际上使用了通用类型参数<ObjectType>(自Xcode 7起):

@interface NSSet<__covariant ObjectType> : NSObject <NSCopying, NSMutableCopying ...

关键字__covariant表示ObjectType的子类型也是可以接受的,因此基本上所有内容都在这里。

所以要回答原始问题:升级Xcode。而且之所以会发生此错误,最肯定的原因是,制作该框架的人使用的Xcode Beta版版本的数量比您高。

但是我回答这个问题的原因是,当您开始在自己的方法声明中使用类型参数时,可能会发生此错误,这在今天可能是更常见的情况。然后,您应该转到类声明(“非参数化类”的类),并添加类型参数或通用类型参数,如上面针对NSSet所示。