当前位置: 首页 > 面试题库 >

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

松飞翮
2023-03-14
问题内容

包含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具有booleans的特定类型CFBooleanRef,并且在创建boolean
CFNumberRefaka 时将使用该类型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从布尔值创建的对象实际上是预定义的常量对象;一为YESNO。您可能很想依靠此来进行标识。但是,尽管目前看来确实如此,并且已在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
}


 类似资料:
  • 问题内容: 在我的spring项目中,我的Dao类具有以下模板: 我的每个Dao类都具有以下结构: 这意味着当我调用方法findById,findByField,findAll时,我应该从Usuario,Usuario和List类型接收对象。 这两个拳头类的返回正确值,但最后一个不返回。当我运行此方法时(从我的服务类中): 我应该看到“ usuario”时收到“对象”作为响应。有人可以告诉我我在做

  • 目前我正在为学校做一个项目,下面是要求: 编写一个Temperature类,它将保持以华氏为单位的温度,并提供获取以华氏、摄氏度和开尔文为单位的温度的方法。该类应具有以下字段: :保持华氏温度的倍增器。 该类应具有以下方法: :构造函数接受华氏温度(双倍)并将其存储在ftemp字段中。 :set Fahrenheit方法接受一个华氏温度(作为双值),并将其存储在ftemp字段中。 :返回ftemp

  • 运行此代码时,Clang(3.9.1)和GCC(7,快照)将“1”、“2”打印到控制台。 但是,MSVC未能编译此代码: source_file.cpp(15):错误C2668:字典::集:对重载函数的模糊调用 source_file.cpp(9):注意:可能是“无效字典::集(int64_t)” source_file.cpp(8):注意:或'无效字典::集(const char*)' 源文件。

  • 我在安装了Javajdk(和jre)1.6的Unix机器上通过Eclipse Juno生成了一个ant文件。当在build.xml文件所在的eclipse之外的机器上运行ant时,一切都很顺利。 现在,问题是当我尝试在另一台机器上运行ant时,其中jdk和jre 1.6都安装了。这是我在运行RedHat 3的另一台机器上得到的结果(无法更改): 当我在build.xml文件中添加这一行时,我得到以

  • 我正在使用Jpa和Hibernate。 我的项目中发生了一件非常奇怪的事情。 我有两个实体:学生和课程,多对多的关系。 很长一段时间内,一切都运行得很好,但突然我遇到了这个问题: 当我找到一个特定的学生(em.find)并使用getter(student.getcourses)返回其课程列表时,我只收到列表的一部分!如果我使用一个查询(“Select s.cources from Students

  • 给定一个类Foo 为什么我用Spock来嘲笑Foo 调用总是返回false? 不确定这是否有区别,但测试是在Groovy/Spock中进行的,而Foo是在Java8中进行的。