You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:50:23