функция swift для возврата индекса массива на основе имени

#ios #swift

#iOS #swift

Вопрос:

У меня есть приведенный ниже код в android java, который случайным образом возвращает индекс массива на основе имени пользователя. Я пытался написать ту же функцию в swift, но безуспешно.

Android array xml

 <array name="username_colors">
    <item>@color/username0</item>
    <item>@color/username1</item>
    <item>@color/username2</item>
    <item>@color/username3</item>
    <item>@color/username4</item>
    <item>@color/username5</item>
    <item>@color/username6</item>
    <item>@color/username7</item>
    <item>@color/username8</item>
    <item>@color/username9</item>
    <item>@color/username10</item>
    <item>@color/username11</item>
</array>
 

Рабочий пример в Android

  private final int[] mUsernameColors = context.getResources().getIntArray(R.array.username_colors);
 
 private int getUsernameColor(String username) {
     int hash = 7;
     for (int i = 0, len = username.length(); i < len; i  ) {
         hash = username.codePointAt(i)   (hash << 5) - hash;
     }
     int index = Math.abs(hash % mUsernameColors.length);
     return mUsernameColors[index];
 }
 

Моя попытка в swift

 func getUsernameColor(username: String) -> String{
    let colors = [
        "#e21400",
        "#91580f",
        "#f8a700",
        "#f78b00",
        "#58dc00",
        "#287b00",
        "#a8f07a",
        "#4ae8c4",
        "#3b88eb",
        "#3824aa",
        "#a700ff",
        "#d300e7"
    ]
    var hash = 7
    let len = colors.count
    //let len = username.count
    for i in (0..<len) {
        //let scalars = colors[i].unicodeScalars
        let scalars = username.unicodeScalars
        let firstScalar = scalars[scalars.startIndex]
        hash = Int(firstScalar.value)   (hash << 5) - hash
    }
    let index = abs(hash % colors.count)

    return colors[index]
}
 

Комментарии:

1. «Я пытался написать ту же функцию в swift, но безуспешно». что это значит?

Ответ №1:

Попробуйте это

 func getUsernameColor(username: String) -> String{
    let colors = [
        "#e21400",
        "#91580f",
        "#f8a700",
        "#f78b00",
        "#58dc00",
        "#287b00",
        "#a8f07a",
        "#4ae8c4",
        "#3b88eb",
        "#3824aa",
        "#a700ff",
        "#d300e7"
    ]
    var hash: UInt32 = 7
    
    for char in username {
        let hashAddition = char.unicodeScalars.first!.value.addingReportingOverflow((hash << 5))
        hash = hashAddition.partialValue.subtractingReportingOverflow(hash).partialValue
    }
    
    let index = abs(Int(hash) % colors.count)
    print(index)
    return colors[index]
}
 

Комментарии:

1. Это Character расширение бессмысленно. Почему не просто unicodeScalars.first!.value ? Кстати, зачем вам преобразовывать Character в String , если у него тоже есть unicodeScalars свойство?

2. Я получил Thread 1: Swift runtime failure: arithmetic overflow