在Xcode 7 GM中,我开始收到这样的警告:
指针缺少可为空的类型说明符(_Nonnull、_Nullable或_Null_unspecified)
在下面的函数声明(NSUserDefaults扩展)中
- (void)setObject:(nullable id)value
forKey:(NSString *)defaultName
objectChanged:(void(^)(NSUserDefaults *userDefaults, id value))changeHandler
objectRamains:(void(^)(NSUserDefaults *userDefaults, id value))remainHandler;
为什么会显示此警告?我应该如何修复它?
发布于 2015-09-13 01:00:47
您还需要为处理程序/块指定nullable
- (void)setObject:(nullable id)value
forKey:(nonnull NSString *)defaultName
objectChanged:(nullable void(^)(NSUserDefaults *userDefaults, id value))changeHandler
objectRamains:(nullable void(^)(NSUserDefaults *userDefaults, id value))remainHandler;
为什么?要归功于斯威夫特。Swift允许可选参数(?),而Objective-C不允许。这是作为两者之间的桥梁,以便Swift编译器知道这些参数是可选的。'Nonnull‘将告诉Swift编译器该参数是必需的。一个可空的,它是可选的
发布于 2016-03-23 04:05:37
您可以在objective c标头中的声明块(函数和变量)周围使用以下宏:
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
然后,您需要为该块中可以为空的引用添加可为空的注释。这适用于函数参数和变量声明。
如下所示:
@interface SMLBaseUserDetailsVC : UIViewController < UICollectionViewDelegate>
NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) IBOutlet UIScrollView *detailsScrollView;
@property (nonatomic, readonly) IBOutlet UICollectionView *photoCV;
@property (nonatomic, weak, readonly) SMLUser *user;
- (IBAction)flagUser:(id)sender;
- (IBAction)closeAction:(nullable id)sender;
- (void) prefetchPhotos;
NS_ASSUME_NONNULL_END
@end
编辑*为什么?这是因为要使objective-c类能够与swift互操作,您需要声明可空性,以便编译器知道是否将属性视为swift可选参数。可空的objective c属性在swift中被称为optionals,并且将这些宏与属性的可空声明符结合使用允许编译器将它们视为optionals (Optionals是monads一个包装对象或nil的对象)。
发布于 2019-07-20 14:49:29
在整个项目中禁用此警告
-Wno-nullability-completeness
。注意:即使在完成构建和重新启动Xcode之后,警告也可能需要几秒钟才能消失,对我来说,Xcode完全更新大约需要15秒。
https://stackoverflow.com/questions/32539285
复制相似问题