objective-c - Objective-C 何时隐式转换为 BOOL?

标签 objective-c boolean type-conversion

我读了Mike Ash's Objective-C pitfalls page ,现在我对将 id 类型的变量隐式转换为 BOOL 感到疑惑。

假设我有一个低位归零的“危险”指针,因此将其转换为 BOOL 会产生 NO,即使它指向一个有效对象.我们称这个“危险”指针为 foo

简单的 if 语句如何工作? if 语句在评估条件时是否将 foo 转换为 BOOL?还是转换为纯 boolean 值?

if( foo )
{
  [myArray addObject:foo];
}

它在三元表达式中的工作方式是否相同?

// Does this break when foo is 'dangerous'?
self.titleLabel.hidden = foo ? YES : NO ; 

或者如果我这样做,三元组只会中断:

// I'm pretty sure it breaks now
self.titleLabel.hidden = ((BOOL)foo) ? YES : NO ; 

我觉得我缺少一些关于 C 语言逻辑运算的基本知识,以及它们与 BOOL 的关系。请大家帮忙赐教。

最佳答案

When does Objective-C implicitly cast to BOOL?

从不,因为这个短语在语义上是不正确的。根据定义,强制转换是显式的。你问的是所谓的“隐式类型转换”(强制 - 谢谢,乔希!)。

此外,严格来说,Objective-C 中的条件并不特殊:它们是从 C 继承而来的。因此,当需要将表达式计算为 boolean 值时,不会将其视为 BOOL,而是作为 int

// Does this break when foo is 'dangerous'?`
self.titleLabel.hidden = foo ? YES : NO;

不,它没有。 (expr) 当用作“boolean ”表达式时,等同于 (expr != 0)。这里没有风险。

// I'm pretty sure it breaks now
self.titleLabel.hidden = ((BOOL)foo) ? YES : NO;

现在这可能会中断,因为 BOOL 只是类型定义为 signed char,这在 iOS 上是 8 位的。因此,如果作为(32 位)指针的 foo 被截断为 8 位,并且指针的低 8 位全部为零,但指针本身不是 nil,这将错误地报告 false。你不想做这种多余的、丑陋的和危险的类型转换。如果你想更明确,写

var = (obj != nil) ? valueOne : valueTwo;

相反。

关于objective-c - Objective-C 何时隐式转换为 BOOL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14529781/

相关文章:

ios - 如何从card.io SDK获取国家名称? -iOS

java - 如何将字符串转换为 double

type-conversion - 如何将字符串转换为使用rust 的字节向量?

c - 安全地将 SIZE_T 转换为 WORD

iphone - 在 iPhone 应用程序中使用 PayPal 实现简单支付?

objective-c - 为什么在定义委托(delegate)时出现错误 "Cannot synthesize weak property in file using manual reference counting"?

objective-c - 未调用 UISwipeGestureRecognizer 方法?

javascript - Javascript 中 new Boolean() 的用途是什么?

PHP: boolean 与 boolean 类型提示

java - 计数器 : decrease method disregards boolean