#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