Swift 4中掩码/混淆邮箱与手机号的最优实现方案是什么?
在Swift 4里处理邮箱和手机号的掩码/混淆,其实有挺简洁高效的实现方式,我给你拆解两种场景的最优解法,直接就能用到项目里👇
邮箱混淆实现
核心思路是把邮箱拆成本地前缀和域名后缀两部分,只混淆本地前缀:保留前缀的前2个字符和最后2个字符,中间用*填充;域名部分完全保留(毕竟域名公开也没啥问题)。
比如你给的例子satheesmk2@gmail.com,拆分后本地前缀是satheesmk2,取前2位sa、后2位k2,中间补6个*,最后拼接域名就得到sa******k2@gmail.com。
下面是封装好的Swift 4代码,还考虑了边界情况(比如本地前缀过短的情况):
func maskEmail(_ email: String) -> String { // 拆分邮箱为本地部分和域名部分 let components = email.split(separator: "@") guard components.count == 2 else { return email } // 无效邮箱直接返回原字符串 let localPart = String(components[0]) let domainPart = String(components[1]) // 处理本地部分:长度<=4时直接保留(避免出现sa**@xx.com这种奇怪的格式) guard localPart.count > 4 else { return email } let prefix = localPart.prefix(2) let suffix = localPart.suffix(2) let maskCount = localPart.count - 4 let mask = String(repeating: "*", count: maskCount) return "\(prefix)\(mask)\(suffix)@\(domainPart)" } // 测试一下 let originalEmail = "satheesmk2@gmail.com" let maskedEmail = maskEmail(originalEmail) print(maskedEmail) // 输出 sa******k2@gmail.com
手机号混淆实现
针对你给的10位手机号例子9876543212,需求是保留前2位和最后1位,中间用*填充。核心思路是截取前后固定位数,中间补对应数量的*,同样可以封装成通用方法,方便调整保留的位数。
Swift 4代码实现:
func maskPhoneNumber(_ phone: String) -> String { // 先确保是纯数字的手机号(可以根据需求加更严格的验证) guard phone.allSatisfy({ $0.isNumber }) else { return phone } let totalLength = phone.count // 针对10位手机号的规则:前2后1,中间7个* guard totalLength == 10 else { // 如果是其他长度(比如国内11位),可以在这里调整规则,比如前3后4,中间4个* return phone } let prefix = phone.prefix(2) let suffix = phone.suffix(1) let maskCount = totalLength - 3 let mask = String(repeating: "*", count: maskCount) return "\(prefix)\(mask)\(suffix)" } // 测试一下 let originalPhone = "9876543212" let maskedPhone = maskPhoneNumber(originalPhone) print(maskedPhone) // 输出 98*******2
额外小提示
- 可以把这两个方法放到
String的扩展里,用起来更顺手,比如"satheesmk2@gmail.com".masked() - 实际项目里记得先做输入合法性校验,比如邮箱格式验证、手机号位数验证,避免出现异常情况
内容的提问来源于stack exchange,提问作者sathishmc2
相关产品推荐
相关产品推荐

