iOS字符串替换:除最后4位外替换为*的实现问题
解决账号号码部分隐藏的问题
嘿,我明白你想要实现的是把账号除最后四位外的所有字符替换成*号,但现在代码反而把最后四位变成了****,问题出在你对Swift字符串Range的使用逻辑上,咱们来一步步修正它:
问题根源分析
你写的这段代码:
let letters = "987654321" let start = letters.endIndex; let end = letters.index(letters.endIndex, offsetBy: -4); let value = "****" let result = letters.replacingCharacters(in: end..<start, with: value) print(result)
这里的end..<start对应的是从倒数第4位到字符串末尾的区间,相当于你把自己想保留的最后四位给替换掉了,结果自然和预期相反。
正确的实现方式
我们需要替换的是字符串开头到倒数第4位之前的部分,同时还要处理账号长度≤4的边界情况(避免索引越界崩溃):
let accountNumber = "987654321" // 先判断账号长度,如果小于等于4,直接返回原字符串(不需要隐藏) guard accountNumber.count > 4 else { print(accountNumber) return } // 计算需要隐藏的范围:从开头到倒数第4位的位置 let hideBoundaryIndex = accountNumber.index(accountNumber.endIndex, offsetBy: -4) let hideRange = accountNumber.startIndex..<hideBoundaryIndex // 生成和隐藏部分长度一致的*号(适配不同长度的账号) let maskedPrefix = String(repeating: "*", count: accountNumber[hideRange].count) // 替换并输出结果 let result = accountNumber.replacingCharacters(in: hideRange, with: maskedPrefix) print(result) // 输出:*****4321
几个关键细节
- 用
startIndex..<hideBoundaryIndex精准定位需要隐藏的前缀区间,而不是末尾 - 用
String(repeating: "*", count: ...)生成和隐藏部分长度匹配的*号,不管账号多长都能适配 - 增加
guard判断处理短账号的情况,防止索引偏移时出现崩溃
内容的提问来源于stack exchange,提问作者harshavardhan reddy
相关产品推荐
相关产品推荐

