如何解决如何在objc中使非指针类型属性可以为空
我想知道如何在 objc 中使这个属性可以为空
@property (nonatomic) BOOL Hood;
@property (nonatomic) BOOL smartclean;
@property (nonatomic) t_ShirtSize size;
@property (nonatomic) NSUInteger newsoftness;
因为 当我但可以为空时,我收到此错误
@property (nullable,nonatomic) BOOL Hood;
Nullability specifier 'nullable' cannot be applied to non-pointer type 'BOOL' (aka 'signed char')
我想让所有 4 个属性都可以为空,我该怎么做
这是M文件
-(instancetype _Nonnull) initWithSize:(t_ShirtSize)size
Hood: (BOOL)hoody {
self = [super init];
if(self) {
Hood = hoody;
_size = size;
}
return self;
}
解决方法
对于 BOOL 属性,您不再需要可空性说明符,也许 NSUInteger 也不需要。
对于 BOOL,您不需要它的原因是它默认为 0
或 <nil>
。
nullable
注释帮助 Swift 了解当 Objective-C 代码与 Swift 接口时引用是否可选。它不会以任何方式改变 Objective-C 的操作。
nil
可以分配给 Objective-C 中的指针,即使它没有可空性注释;这就是 C 指针的本质。
标量值类型(整数、布尔值等)在 Objective-C 中不能为 null,它们总是有一个值,因为没有指向它们的值的指针。它们的值直接存储。
Objective-C 没有像 Swift 那样直接支持可选或可为空的值类型
在 Swift 中,可选项实际上是一个包含包装值的结构体和一个指示可选项是否有值的属性。编译器对你隐藏了这个细节。
您可以使用 NSNumber。这将标量值类型包装在一个对象中。对象引用可以是 nil
,nullable
@property (nonatomic,nullable) NSNumber* Hood;
@property (nonatomic,nullable) NSNumber smartclean;
@property (nonatomic) t_ShirtSize size;
@property (nonatomic,nullable) NSNumber newsoftness;
,
如果您绝对需要一个可为空的 BOOL
,您可以使用 NSNumber
作为包装器:
@property (nullable,nonatomic) NSNumber* Hood;
使用 Hood = @YES; /* or @NO */
赋值,使用 Hood.boolValue
再次读取值。
请注意,正如其他人已经说过的,这不是 Swift 的可选项的完全替代,并且您必须格外小心以始终使用正确的数据类型 - 如果您不小心存储了一个浮点数,编译器将不会帮助您“可为空的 NSUInteger”中的点值。
,BOOL 是一个原始类型,而不是一个对象。如果您需要一个对象,通常的做法是将您的 BOOL 包装在一个 NSNumber 中:
https://developer.apple.com/documentation/foundation/nsnumber/1415728-initwithbool?language=objc
https://developer.apple.com/documentation/foundation/nsnumber/1410865-boolvalue?language=objc
现在你有了一个 NSNumber,所以你可以用 nil
来表示那里没有对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。