これは私の編集およびチェックされたソリューションです:
- (NSString *)generateRandString {
NSString *alphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
NSMutableString *s;
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
do
{
s = [NSMutableString stringWithCapacity:5];
for (NSUInteger i = 0U; i < 5; i++)
{
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s appendFormat:@"%C", c];
}
}
while ([s rangeOfCharacterFromSet:set].location == NSNotFound);
return s;
}
私はまた、Dan Dyer が提案した解決策を実装しました (そして、それは明らかに私のものよりも優れています)。私の実装はおそらく完璧ではありません(別の関数を作成する代わりに同じ機能を数回使用しますが、実装するのは難しくないと思います)が、ダンが提案したとおりに機能します。
NSString *alphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
NSMutableString *s = [NSMutableString string];
NSCharacterSet *set = [NSCharacterSet decimalDigitCharacterSet];
NSString *digits = @"0123456789";
for (NSUInteger i = 0U; i < 4; i++)
{
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s appendFormat:@"%C", c];
}
if ([s rangeOfCharacterFromSet:set].location == NSNotFound)
{
u_int32_t r = arc4random() % [digits length];
unichar c = [digits characterAtIndex:r];
[s appendFormat:@"%C", c];
}
else
{
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s insertString:[NSString stringWithFormat:@"%C", c] atIndex:arc4random() % s.length];
}