我正在为 iOS 创建一个文字游戏。我想防止玩家制作复数词。有没有我可以用来编写函数的字典
isPluralWord(@"tables")
这将返回 true 和
isPluralWord(@"table")
将返回假。
谢谢!
我正在为 iOS 创建一个文字游戏。我想防止玩家制作复数词。有没有我可以用来编写函数的字典
isPluralWord(@"tables")
这将返回 true 和
isPluralWord(@"table")
将返回假。
谢谢!
天真的和不正确的解决方案:
BOOL isPlural(NSString *s)
{
return [s characterAtIndex:s.length - 1] == 's';
}
正确的解决方案是将其与检测不规则单词(例如“formula”和“formulae”)以及不是复数但无论如何以“s”结尾的单词(例如“括号”和“括号”)的智能结合起来. 为此,您可能想要获取某种具有一些语法注释的英语单词数据库。
您可以NSLinguisticTagger
这样使用:
#import <Foundation/Foundation.h>
NSLinguisticTagger *linguisticTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[NSLinguisticTagSchemeLemma] options:kNilOptions];
linguisticTagger.string = @"table tables";
[linguisticTagger enumerateTagsInRange:NSMakeRange(0, linguisticTagger.string.length) scheme:NSLinguisticTagSchemeLemma options:NSLinguisticTaggerOmitWhitespace usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
NSString *word = [linguisticTagger.string substringWithRange:tokenRange];
if ([word isEqualToString:tag]) {
NSLog(@"word '%@' is singular", word);
} else {
NSLog(@"word '%@' is plural", word);
}
}];
而不是检查字符串末尾的字符's',您应该使用Localizable.stringsdict来表示这样的复数单词。在这个 plist 中,您可以提及您的键映射与其复数。
请查看以下此类字符串的示例
<key>%d Likes</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@likes@</string>
<key>likes</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%d Like</string>
<key>other</key>
<string>%d Likes</string>
</dict>
</dict>
在 plist 中定义上述复数后,您可以通过将整数与字符串一起传递来直接调用它
NSInteger x = 1 传递 1,其他数字传递任何其他数字
NSString *pluralString = [NSString localizedStringWithFormat:NSLocalizedString(@"%d Likes", @"X number of Likes for a post"), x]
In case of X = 1, you will get 1 Like
And, In case of X = any number other than 1, consider 10, answer will be 10 Likes.
您还可以查看链接以获取更多参考: http: //macoscope.com/blog/effective-localization-when-working-with-language-plural-rules/