首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >指针缺少可为空的类型说明符

指针缺少可为空的类型说明符
EN

Stack Overflow用户
提问于 2015-09-12 21:17:53
回答 6查看 52.8K关注 0票数 69

在Xcode 7 GM中,我开始收到这样的警告:

指针缺少可为空的类型说明符(_Nonnull、_Nullable或_Null_unspecified)

在下面的函数声明(NSUserDefaults扩展)中

代码语言:javascript
复制
- (void)setObject:(nullable id)value
           forKey:(NSString *)defaultName
    objectChanged:(void(^)(NSUserDefaults *userDefaults, id value))changeHandler
    objectRamains:(void(^)(NSUserDefaults *userDefaults, id value))remainHandler;

为什么会显示此警告?我应该如何修复它?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-09-13 01:00:47

您还需要为处理程序/块指定nullable

代码语言:javascript
复制
- (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编译器该参数是必需的。一个可空的,它是可选的

有关更多信息,请阅读:https://developer.apple.com/swift/blog/?id=25

票数 63
EN

Stack Overflow用户

发布于 2016-03-23 04:05:37

您可以在objective c标头中的声明块(函数和变量)周围使用以下宏:

代码语言:javascript
复制
NS_ASSUME_NONNULL_BEGIN 

NS_ASSUME_NONNULL_END

然后,您需要为该块中可以为空的引用添加可为空的注释。这适用于函数参数和变量声明。

如下所示:

代码语言:javascript
复制
@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的对象)。

票数 66
EN

Stack Overflow用户

发布于 2019-07-20 14:49:29

在整个项目中禁用此警告

  1. 转至生成设置
  2. 确保您正在查看字段Other Warning Flags的"All“选项卡而不是"Basic”或"Customized"
  3. Search。
  4. 添加以下标志:-Wno-nullability-completeness
  5. 现在清理并构建( Xcode K然后Xcode R)
  6. 退出并重新打开它(不要跳过这一步!)

注意:即使在完成构建和重新启动Xcode之后,警告也可能需要几秒钟才能消失,对我来说,Xcode完全更新大约需要15秒。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32539285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档