如果对象为 nil,则返回显式签入方法



如果我有如下方法:

-(BOOL)shouldResize {
    return _view != nil;
}

其中_view是指向对象的指针,显式 nil 检查是必要/推荐的,还是只需执行以下操作就足够了:

-(BOOL)shouldResize {
    return _view;
}

我想知道在将指针投射到 BOOL 时是否会弹出任何奇怪的行为,如以下示例所示:https://developer.apple.com/documentation/objectivec/bool?language=objc

(我想你也可以做return !!_view,对吧?

根据平台或体系结构的不同,BOOL可能等同于signed char。因此,return _view是不安全的。_view 的实际指针值将被截断为单个字节。即使_view不是nil,这个字节也很可能是 0。在这种情况下,代码将在应该为 true 时返回 false。

return _view != nil是安全合理的。使用return !!_view是正确的,可能合适,也可能不适合,具体取决于团队的编码标准。在某些地方,这是"规范化"布尔表达式的惯用方式。其他人可能会觉得它太聪明了一半,而且"丑陋"(如此处其他答案所示)。

为了可读性,我更喜欢"return _view != nil"。该方法返回一个布尔值,因此我更喜欢从方法中的代码中显而易见。

在您的情况下,第二个选项(返回_view)也可以。

"回来!_view"我觉得很丑。

BOOL 类型在 32 位和 64 位模式下的定义不同,因此行为不同。因此,返回_view而不是_view != nil 是一个错误。

从 Swift 那里得到一个提示(无论如何你很快就会这样做)。在 Swift 中,self.view != nil 是唯一合法的方式。谢天谢地。

举个例子,聪明是多么危险,"回报!_view"不仅丑陋,而且是错误的。它的作用与请求相反。

只需返回视图将自动处理视图是否为零。如果为 nil,它将返回"否"和"是"。所以第二个版本的 shouldResize 就足够了。

根据我的说法,最佳做法是进行明确的 nil 检查,以便清楚地了解、更好的可维护性并避免意外。

最新更新