一、为什么你的字符串比较总出问题?
你是不是遇到过这种情况:明明两个看起来一模一样的字符串,用==
比较却返回false?在iOS开发中,字符串比较藏着不少新手容易踩的坑。今天我们就来揭开它的神秘面纱!
二、==
和isEqual
的区别
这是90%新手会犯的错!记住这两个关键点:
==
比较的是对象内存地址,就像对比两个快递柜是不是同一个格子[str1 isEqualToString:str2]
才是真正的内容对比,就像检查两个包裹里的物品是否相同
举个栗子🌰:
NSString *s1 = @"Hello";
NSString *s2 = [NSString stringWithFormat:@"%@", @"Hello"];
NSLog(@"%d", s1 == s2); // 输出0
NSLog(@"%d", [s1 isEqualToString:s2]); // 输出1
三、大小写敏感是个隐形炸弹
iOS默认区分字母大小写!想要无视大小写比较?试试这些方法:
NSComparisonResult result = [str1 compare:str2 options:NSCaseInsensitiveSearch];
- 先转小写再比较:
[[str1 lowercaseString] isEqualToString:[str2 lowercaseString]]
敲黑板!lowercaseString会创建新对象,频繁使用要注意性能问题。
四、特殊字符的隐藏陷阱
肉眼不可见的字符可能毁掉你的比较逻辑:
- 空格:普通空格 vs 全角空格( )
- 换行符:\n 和 \r\n 的区别
- Unicode字符:中文全角标点 vs 英文半角标点
建议使用stringByTrimmingCharactersInSet
先处理字符串:
NSString *cleanStr = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
五、高级比较技巧包
掌握这些方法让你事半功倍:
场景 | 方法 | 示例 |
---|---|---|
前缀匹配 | hasPrefix | [url hasPrefix:@"https://"] |
后缀匹配 | hasSuffix | [file hasSuffix:@".png"] |
包含检测 | rangeOfString | if ([text rangeOfString:@"紧急"].location != NSNotFound) |
六、排序比较的大学问
当需要排序字符串数组时,推荐使用:
[array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]
这个方案会自动处理:
- 本地化字符排序规则
- 数字的自然排序(比如”file2″排在”file10″前面)
- 大小写混合排序
小编观点:别再用==
比较字符串内容了!把isEqualToString
设为肌肉记忆,遇到特殊需求时灵活组合各种比较选项,这才是iOS开发的正确姿势。