如何在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。这将标量值类型包装在一个对象中。对象引用可以是 nilnullable

也是如此
@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 来表示那里没有对象。