在我的iOS应用程序的其中一个屏幕上,我使用一个标签,其上的文字应根据对象数量而变化:一个苹果,两个苹果 S 和其他。 我创建了 Localizable.stringdict 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>searches</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@search_count@</string>
<key>search_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>s</string>
<key>one</key>
<string>остался %s поиск</string>
<key>many</key>
<string>осталось %s поиска</string>
<key>other</key>
<string>осталось %s поиска</string>
</dict>
</dict>
稍后在viewController类中,我创建了一个函数
private func searches(_ count: UInt) {
let format: String = NSLocalizedString("searches", comment: "")
let result: String = String.localizedStringWithFormat(format, count)
print(result)
}
并在viewDidLoad中调用此函数。
应用程序在启动时崩溃,错误为线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0)。
Debbuger指示创建 Result 的行。据我了解,问题是未创建 Format 。
该问题如何解决?
答案 0 :(得分:2)
您的词典将“ s”指定为字符串格式说明符,即C字符串。对于UInt
(作为基金会C类型的NSUInteger
),应改为“ lu”(比较String Format Specifiers):
<key>NSStringLocalizedFormatKey</key>
<string>%#@search_count@</string>
<key>search_count</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>lu</string>
<key>one</key>
<string>остался %lu поиск</string>
<key>many</key>
<string>осталось %lu поиска</string>
<key>other</key>
<string>осталось %lu поиска</string>
</dict>