SwiftUI位移运算:如何通过哈希将字符串转为指定数组索引?
Swift实现字符串映射固定颜色的完整代码
你的尝试代码存在几个关键问题:
- 遍历字符串时,
value.enumerated()返回的是(offset: Int, element: Character),不能用value[index]访问字符; - 获取字符Unicode编码的方式错误,Swift中需要将
Character转为UnicodeScalar后取其数值; - 缺少空字符串的处理逻辑;
- 未完成哈希值映射到颜色数组索引的步骤;
- 函数声明返回
String但无返回语句。
完整实现代码
首先定义和JS版本一致的颜色数组:
let colors = [ "#e51c23", "#e91e63", "#9c27b0", "#673ab7", "#3f51b5", "#5677fc", "#03a9f4", "#00bcd4", "#009688", "#259b24", "#8bc34a", "#afb42b", "#ff9800", "#ff5722", "#795548", "#607d8b" ]
然后是复刻JS逻辑的字符串转颜色函数:
func getColorFromString(value: String) -> String { guard !value.isEmpty else { // 空字符串对应原JS返回的初始哈希值0,这里返回数组第一个颜色 return colors[0] } var hash = 0 for character in value { // 获取字符的Unicode标量值,对齐JS的charCodeAt逻辑 guard let scalar = character.unicodeScalars.first else { continue } let charCode = Int(scalar.value) hash = charCode + ((hash << 5) - hash) hash = hash & hash // 确保为32位整数,和JS逻辑一致 } // 处理哈希正负,确保索引在数组合法范围内 let index = ((hash % colors.count) + colors.count) % colors.count return colors[index] }
关键逻辑说明
- 空字符串处理:原JS代码返回初始哈希值0,这里对应返回数组第一个颜色,和原逻辑完全对齐;
- 字符编码获取:通过
character.unicodeScalars.first获取字符的Unicode标量值,等价于JS的charCodeAt方法; - 哈希计算:完全复刻JS的计算逻辑,
hash << 5是左移5位(等价于乘以32),(hash <<5) - hash即hash *31,这是经典的字符串哈希算法; - 索引安全处理:通过
((hash % colors.count) + colors.count) % colors.count确保即使哈希值为负,也能得到合法的非负数组索引。
内容的提问来源于stack exchange,提问作者Wouter Dijks
相关产品推荐
相关产品推荐

