-1

嗨 iam 学习 IOS 开发和学习 porpoises
我想知道如何在 objc 中使这个属性可以为空(这四个 @property)

@property (nonatomic) BOOL Hood;
@property (nonatomic) BOOL smartclean;
@property (nonatomic) t_ShirtSize size;
@property (nonatomic) NSUInteger newsoftness;

因为当我使用 nullable 我得到这个错误

@property (nullable,nonatomic) BOOL  Hood;

Nullability specifier 'nullable' cannot be applied to non-pointer type 'BOOL' (aka 'signed char')

什么是使所有 4 个属性都可以为空的正确方法我该怎么做(接受 Null)

这是我的应用程序的 M 文件

-(instancetype _Nonnull) initWithSize:(t_ShirtSize)size
                         Hood: (BOOL)hoody {
    
    self = [super init];
    if(self) {
        Hood = hoody;
        _size = size;
    }
    
    return self;
}
4

4 回答 4

1

如果您绝对需要 nullable BOOL,则可以NSNumber用作包装器:

@property (nullable,nonatomic) NSNumber* Hood;

用于Hood = @YES; /* or @NO */分配一个值,并Hood.boolValue再次读取该值。

请注意,正如其他人已经说过的,这并不能完全替代 Swift 的可选项,并且您必须格外小心以始终使用正确的数据类型 - 如果您不小心将浮点值存储在你的“可为空的 NSUInteger”。

于 2021-04-07T22:00:30.437 回答
1

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表明那里没有对象。

于 2021-04-07T22:02:08.087 回答
1

nullableObjective-C 代码与 Swift 交互时,注释帮助 Swift 理解引用是否是可选的。它不会以任何方式改变 Objective-C 的操作。

nil即使它没有可空性注释,也可以将其分配给 Objective-C 中的指针;这就是 C 指针的本质。

标量值类型(整数、布尔值等)在 Objective-C 中不能为空,它们总是有一个值,因为没有指向它们的值的指针。它们的值直接存储。

没有像 Swift 那样对可选或可为空的值类型的直接 Objective-C 支持

在 Swift 中,可选项实际上是一个结构,其中包含包装的值和一个属性,该属性指示可选项是否具有值。编译器对您隐藏了这个细节。

你可以使用NSNumber。这将标量值类型包装在对象中。对象引用可以nil,所以是nullable

@property (nonatomic, nullable) NSNumber* Hood;
@property (nonatomic, nullable) NSNumber* smartclean;
@property (nonatomic) t_ShirtSize size;
@property (nonatomic, nullable) NSNumber* newsoftness;
于 2021-04-07T21:44:47.780 回答
0

您不再需要具有 BOOL 属性的可空性说明符,也许 NSUInteger 也不需要该说明符。

对于 BOOL,你不需要它的原因是它默认0<nil>.

于 2021-04-07T17:37:10.793 回答