NSString比较@""== nil

Dav*_*ton 8 cocoa-touch objective-c ios

我想比较两个字符串,我希望nil等于空字符串(@"").现在我正在这样做,这很好:

if ([self.firstName ? self.firstName : @"" isEqualToString:anotherContact.firstName ? anotherContact.firstName : @""]) {
    // They are equal.
}
Run Code Online (Sandbox Code Playgroud)

但似乎有一些我想念的东西更简单.

我不是在寻找区分大小写的.如果情况不同,那么测试应该失败.

Ada*_*ach 13

[string length]
Run Code Online (Sandbox Code Playgroud)

工作,但如果它也是零,它将返回零.如果这对你来说是可以接受的,那就更简单了.

顺便说一句,嵌套的三元运算符可以在您自己的家中隐私,但是如果您正在编写代码进行共享,那么最好将其展开一点,这样很明显.

在回应评论时,我这样做的方式是这样的:

    if((([a length] == 0) && ([b length] == 0)) ||
        ([a isEqualToString:b])) {
        // they are equal
    }
Run Code Online (Sandbox Code Playgroud)

如果任一条款成功,则字符串相等.第二个捕获任何实际上相等的非零字符串,包括@"" == @"".第一次捕获a和b两者nil,或一个nil和一个@"".我确实写了第((a == nil) && (b == nil))一个,但你说@""应该等于零.


Bry*_*hen 12

你可以使用?:运营商.a ? a : b与a ?: b(a仅执行一次的副作用)相同

if ([self.firstName ?: @"" isEqualToString:anotherContact.firstName ?: @""]) {
    // They are equal.
}
Run Code Online (Sandbox Code Playgroud)

  • 我也会用这种优雅的方式写出来.虽然我可能会将这些`?:`表达式放在括号内以便于阅读. (2认同)

Jos*_*ell 9

在这种情况下我建议使用一个函数:

NSString * emptyStringIfNil(NSString * s)
{
    if( !s ) return @"";
    else return s;
}
Run Code Online (Sandbox Code Playgroud)
if ([emptyStringIfNil(self.firstName) isEqualToString:emptyStringIfNil(anotherContact.firstName)]) {
    // They are equal.
}
Run Code Online (Sandbox Code Playgroud)

更容易阅读.您可以根据需要执行功能的内部; 我会说三元条件在那里是合理的.