Cocoa 如何创建带有一个随机字母的NSString?

Cocoa 如何创建带有一个随机字母的NSString?,cocoa,nsstring,Cocoa,Nsstring,我需要创建一个包含单个随机大写字母的NSString 我可以得到random int,我可以用它构造一个C字符串,然后生成NSString,但我想一定有更好的方法 谢谢 >你可以只做一个包含你认为是字母的NSnpe并从中拉随机字符。下面是一个示例类别: @implementation NSString(RandomLetter) - (NSString *)randomLetter { return [self substringWithRange:[self rangeOfCompos

我需要创建一个包含单个随机大写字母的NSString

我可以得到random int,我可以用它构造一个C字符串,然后生成NSString,但我想一定有更好的方法


谢谢

>你可以只做一个包含你认为是字母的NSnpe并从中拉随机字符。下面是一个示例类别:

@implementation NSString(RandomLetter)
- (NSString *)randomLetter {
    return [self substringWithRange:[self rangeOfComposedCharacterSequenceAtIndex:random()%[self length]]];
}
@end

(显然,在某个时候你需要
srandom(time())
。可能在你的类别中包含一个initialize方法。)

我认为最好的方法是使用c字符串,这样你就可以使用显式编码。下面是一个例子:

NSInteger MyRandomIntegerBetween(NSInteger min, NSInteger max) {
    return (random() % (max - min + 1)) + min;
}

NSString *MyStringWithRandomUppercaseLetter(void) {
    char string[2] = {0, 0};
    string[0] = MyRandomIntegerBetween(65, 90); /// 'A' -> 'Z' in ASCII.
    return [[[NSString alloc] initWithCString:string encoding:NSASCIIStringEncoding] autorelease];
}
这里有一个替代方案,实际上几乎是一样的,但是避免使用C字符串

NSString *MyStringWithRandomUppercaseLetter(void) {
    unichar letter = MyRandomIntegerBetween(65, 90);
    return [[[NSString alloc] initWithCharacters:&letter length:1] autorelease];
}

我更喜欢第一种方法中的显式字符编码,但它们都是正确的。

对于A-Z,这种方法将非常有效。如果你不想把你的领域限制在像A-Z这样的东西上,你需要小心使用这种技术。用户所认为的单个字符可能不是一个单一的unichar。在某种程度上,字符的概念是模棱两可的。我对其进行了更改,使其明确使用Cocoa对合成字符序列的支持。谢谢!这就是我所用的。这根本不能处理字符序列,所以我不知道你为什么觉得这是优越的。哦,我同意Chuck。不同之处在于,此代码显式限制为'A'->'Z'。对于另一种方法,调用方需要提前意识到该问题。在这里,这个函数的调用者不可能在处理需要多个代码点的“字符”时出错。