Странное возвращаемое значение после генерации случайной строки (Swift 3)

Я создал метод, который генерирует и возвращает случайную строку как букв, так и цифр, но по какой-то причине я получаю только строку с числами, а длина строки не приближается к тому, что я просил ее быть. Несколько примеров возвращенных строк: "478388299949939566" (вставлен 18 как длина), "3772919388584334" (вставлен 9 как длина), "2293010089409293945" (вставлен 6 как длина). Кто-нибудь может увидеть, что мне здесь не хватает?

func generateRandomStringWithLength(length:Int) -> String {

    let randomString:NSMutableString = NSMutableString(capacity: length)

    let letters:NSMutableString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

    for index in 0...length {

        let randomIndex:Int = Int(arc4random_uniform(UInt32(62)))
        randomString.append("\(letters.character(at: randomIndex))")

    }

    return String(randomString)
}

Ответы

Ответ 1

Ваша проблема здесь:

letters.character(at: randomIndex)

функция возвращает символ в указанном индексе кодового индекса UTF-16, а не только символ

Вот моя версия, я думаю, ее более быстро.

func generateRandomStringWithLength(length: Int) -> String {

    var randomString = ""
    let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

    for _ in 1...length {
        let randomIndex  = Int(arc4random_uniform(UInt32(letters.characters.count)))
        let a = letters.index(letters.startIndex, offsetBy: randomIndex)
        randomString +=  String(letters[a])
    }

    return randomString
}

generateRandomStringWithLength(length: 5)

Ответ 2

Используйте это:

func generateRandomStringWithLength(length:Int) -> String {

        let randomString:NSMutableString = NSMutableString(capacity: length)

        let letters:NSMutableString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

        var i: Int = 0

        while i < length {

            let randomIndex:Int = Int(arc4random_uniform(UInt32(letters.length)))
            randomString.appendString("\(Character( UnicodeScalar( letters.characterAtIndex(randomIndex))))")
            i += 1
        }

        return String(randomString)
    }

Вызов метода generateRandomStringWithLength:

print(generateRandomStringWithLength(5))

print(generateRandomStringWithLength(10))

print(generateRandomStringWithLength(20))

print(generateRandomStringWithLength(7))

print(generateRandomStringWithLength(14))

Результат выборки:

GIrqb
nWmieQRVdk
r0It9V1xkGFRa2HVwtCw
RLIRuVI
nXnFGV2LQ3CjbD