【问题标题】:How to create an NSString with one random letter?如何用一个随机字母创建一个 NSString?
【发布时间】:2009-06-23 23:24:12
【问题描述】:

我需要创建一个具有单个随机大写字母的 NSString。

我可以得到随机整数,我可以从中构造一个 C 字符串,然后生成 NSString,但我想必须有更好、更可可的方式。

谢谢!

【问题讨论】:

    标签: cocoa nsstring


    【解决方案1】:

    您可以只创建一个包含您认为是字母的 NSString 并从中提取一个随机字符。这是一个示例类别:

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

    (很明显,您有时需要srandom(time())。也许在您的类别中包含一个初始化方法。)

    【讨论】:

    • 使用 A-Z,这种方法效果很好。如果您不打算将域限制在 A-Z 之类的范围内,则需要小心使用这种技术。用户认为的单个字符可能不是单个 unichar。
    • 有一点,角色的概念是模棱两可的。我已对其进行了更改,使其明确使用 Cocoa 对组合字符序列的支持。
    • 谢谢!这就是我的选择。
    【解决方案2】:

    我认为最好的方法是使用 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”。使用另一种方法,调用者需要提前意识到这个问题。在这里,这个函数的调用者没有机会犯与需要多个代码点的“字符”有关的错误。
    猜你喜欢
    • 2017-03-18
    • 2011-09-30
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2018-11-19
    • 2020-10-23
    • 1970-01-01
    • 2021-02-21
    相关资源
    最近更新 更多