ske*_*ech 12 cocoa nsnumber swift
包含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
Run Code Online (Sandbox Code Playgroud)
但是,保留了有关其原始类型的信息,我们可以在此处看到:
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
Run Code Online (Sandbox Code Playgroud)
问题是:这些方法中的哪一种是确定Bool何时被包裹在NSNumber中而不是其他内容的最佳(和/或最安全)方法?都一样有效吗?或者,还有另一种更好的解决方案吗?
CRD*_*CRD 20
您可以针对Objective-C提出相同的问题,这是Objective-C中的答案 - 您可以从Swift调用或转换为Swift.
NSNumber是免费的桥接CFNumberRef,这是另一种方式,说一个NSNumber对象实际上是CFNumber一个(反之亦然).现在CFNumberRef有布尔特定类型的,CFBooleanRef和这是用来创建一个布尔值,当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;
}
Run Code Online (Sandbox Code Playgroud)
注意:您可能会注意到NSNumber/ CFNumber布尔值创建的对象实际上是预定义的常量对象; 一个YES,一个NO.你可能很想依靠它进行识别.但是,虽然目前似乎是正确的,并且在Apple的源代码中显示,但据我们所知,它没有记录,因此不应该依赖.
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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1720 次 |
| 最近记录: |