有没有正确的方法来确定NSNumber是使用Swift从Bool派生的?
包含Bool的NSNumber很容易与可以包装在NSNumber类中的其他类型混淆:
NSNumber(bool:true).boolValue // trueNSNumber(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 // trueNSNumber(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
具有booleans的特定类型CFBooleanRef
,并且在创建boolean
CFNumberRef
aka 时将使用该类型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;
}
注意: 您可能会注意到NSNumber
/
CFNumber
从布尔值创建的对象实际上是预定义的常量对象;一为YES
一NO
。您可能很想依靠此来进行标识。但是,尽管目前看来确实如此,并且已在Apple的源代码中显示,但据我们所知,它
因此不应依赖。
高温超导
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
}
以上是 有没有正确的方法来确定NSNumber是使用Swift从Bool派生的? 的全部内容, 来源链接: utcz.com/qa/407363.html