我今天在我的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);
答案 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所示。