我在iOS16中遇到了一个bug:当从Swift传递本地化字符串到Objective-C,与另一个相同的本地化字符串(在Objective-C中定义)进行比较时,结果可能是错误的,并且参数顺序可能会影响结果。请看以下演示:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let tc = TestClass()
tc.receive(NSLocalizedString("Start", comment:""))
}
}
@implementation TestClass
- (void)receive:(NSString *)swiftString {
NSString *objcString = NSLocalizedString(@"Start", @"");
BOOL result1 = [swiftString isEqualToString:objcString];
BOOL result2 = [objcString isEqualToString:swiftString];
NSLog(@"result: %d, %d", result1, result2);
}
@end
它是可本地化的(以日语为例,但任何拉丁字母以外的书写系统都可以复制这个漏洞):
"Start" = "開始";
输出:
result: 0, 1
我们不知道这个问题的根本原因是来自 NSLocalizedString()
还是 -isEqualToString
。在iOS15上不会出现这种情况。
有其他人遇到过这个错误吗?
NSLog(@"swiftString: %@", [[swiftString dataUsingEncoding:NSUTF32StringEncoding] debugDescription]);
和NSLog(@"objcString: %@", [[objcString dataUsingEncoding:NSUTF32StringEncoding] debugDescription]);
添加到Objective-C方法中,并显示输出结果? - Martin R