gpt4 book ai didi

swift - 是否有正确的方法来确定 NSNumber 是使用 Swift 从 Bool 派生的?

转载 作者:IT王子 更新时间:2023-10-29 05:29:57 27 4
gpt4 key购买 nike

包含 Bool 的 NSNumber 很容易与其他可以包装在 NSNumber 类中的类型混淆:

NSNumber(bool:true).boolValue // true
NSNumber(integer: 1).boolValue // true
NSNumber(integer: 1) as? Bool // true
NSNumber(bool:true) as? Int // 1

NSNumber(bool:true).isEqualToNumber(1) // true
NSNumber(integer: 1).isEqualToNumber(true) // true

然而,关于其原始类型的信息被保留,正如我们在这里看到的:

NSNumber(bool:true).objCType.memory == 99 // true
NSNumber(bool:true).dynamicType.className() == "__NSCFBoolean" // true
NSNumber(bool:true).isEqualToValue(true) || NSNumber(bool:true).isEqualToValue(false) //true

问题是:这些方法中的哪一种是确定 Bool 何时被包装在 NSNumber 而不是其他东西中的最佳(和/或最安全)方法?都同样有效吗?或者,还有其他更好的解决方案吗?

最佳答案

您可以针对 Objective-C 提出相同的问题,这里是 Objective-C 中的答案 - 您可以从 Swift 调用或转换成 Swift。

NSNumber 是免费桥接到 CFNumberRef 的,这是另一种说法 NSNumber 对象实际上是 CFNumber 一个(反之亦然)。现在 CFNumberRef 有一个特定的 bool 值类型,CFBooleanRef,这在创建 bool 值 CFNumberRef 又名 NSNumber * 时使用>...所以您需要做的就是检查您的 NSNumber * 是否是 CFBooleanRef 的实例:

- (BOOL) isBoolNumber:(NSNumber *)num
{
CFTypeID boolID = CFBooleanGetTypeID(); // the type ID of CFBoolean
CFTypeID numID = CFGetTypeID((__bridge CFTypeRef)(num)); // the type ID of num
return numID == boolID;
}

注意:您可能会注意到从 bool 值创建的NSNumber/CFNumber 对象实际上是预定义的常量对象;一个用于 YES,一个用于 NO。您可能会想依靠它来进行识别。然而,尽管目前看来是正确的,并且显示在 Apple's source code 中。 ,据我们所知,它没有记录,因此不应依赖。

HTH

附录

Swift 代码翻译(由 GoodbyeStackOverflow 提供):

func isBoolNumber(num:NSNumber) -> Bool
{
let boolID = CFBooleanGetTypeID() // the type ID of CFBoolean
let numID = CFGetTypeID(num) // the type ID of num
return numID == boolID
}

关于swift - 是否有正确的方法来确定 NSNumber 是使用 Swift 从 Bool 派生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30215680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com