首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Swift到Objective的iOS 16在NSLocalizedString中的可能缺陷

从Swift到Objective的iOS 16在NSLocalizedString中的可能缺陷
EN

Stack Overflow用户
提问于 2022-10-17 06:45:39
回答 1查看 234关注 0票数 6

我在iOS16中遇到了一个错误:当一个本地化字符串从Swift传递到Objective,并与另一个相同的本地化字符串(在Objective中定义)进行比较时,结果可能是假的,参数顺序可能会影响结果。见演示:

代码语言:javascript
运行
复制
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let tc = TestClass()
        tc.receive(NSLocalizedString("Start", comment:""))
    }
}
代码语言:javascript
运行
复制
@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

它是可本地化的(以日语为例,但除拉丁文以外的任何书写系统都可以复制bug):

代码语言:javascript
运行
复制
"Start" = "開始";

产出:

代码语言:javascript
运行
复制
result: 0, 1

我们不知道其根本原因是NSLocalizedString()还是-isEqualToString。这种情况在iOS15上不会发生。

还有其他人遇到过这个错误吗?

EN

回答 1

Stack Overflow用户

发布于 2022-10-18 07:37:45

这看起来肯定像一个bug,我可以在Xcode iOS 16模拟器中再现它。调试器显示

代码语言:javascript
运行
复制
NSString *objcString = NSLocalizedString(@"Start", @"");

_NSBPlistMappedString的一个实例,它是NSString的一个未记录的子类。

代码语言:javascript
运行
复制
(lldb) p objcString
(_NSBPlistMappedString *) $1 = 0x8230ceeb696930f7
(lldb) p [objcString superclass]
(Class) $2 = NSString

显然,在iOS 16中没有正确实现Swift字符串与该子类实例的比较。

解决方法1:使用compare而不是isEqualToString

代码语言:javascript
运行
复制
NSString *objcString = NSLocalizedString(@"Start", @"");
BOOL result1 = [swiftString compare:objcString] == NSOrderedSame;
BOOL result2 = [objcString compare:swiftString] == NSOrderedSame;
NSLog(@"result: %d, %d", result1, result2);
// result: 1, 1

解决方法2:确保objcStringNSString的一个实例

代码语言:javascript
运行
复制
NSString *objcString = @(NSLocalizedString(@"Start", @"").UTF8String);
BOOL result1 = [swiftString isEqualToString:objcString];
BOOL result2 = [objcString isEqualToString:swiftString];
NSLog(@"result: %d, %d", result1, result2);
// result: 1, 1

当然,这两种解决办法都不是很令人满意。正如注释中所建议的,错误应该是向苹果报告

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74093430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档