ios - 部分文本隐藏在 Swift TextField 中
问题描述
我使用像 (555) 555-5555 这样的掩码,但我也希望它看起来像 (555) 5 ** - ****。输入文本时,我该怎么做才能像这样屏蔽用户?
掩码功能:
func applyPatternOnNumbers(pattern: String, replacmentCharacter: Character) -> String {
var pureNumber = self.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression)
for index in 0 ..< pattern.count {
guard index < pureNumber.count else { return pureNumber }
let stringIndex = String.Index(encodedOffset: index)
let patternCharacter = pattern[stringIndex]
guard patternCharacter != replacmentCharacter else { continue }
pureNumber.insert(patternCharacter, at: stringIndex)
}
return pureNumber
}
用法:
sender.text = textString.applyPatternOnNumbers(pattern: "(###) ###-####", replacmentCharacter: "#")
解决方案
您可以创建一个扩展String
来屏蔽除国家/地区代码以外的所有数字(圆括号之间的任何数字)。请注意,此功能肯定会有一些性能改进,但我希望它至少可以帮助您入门:
extension String {
func masked(replacementCharacter: Character = "*") -> String {
let regex = "\\(.*?\\)"
let ranges = self.ranges(pattern: regex)
func isContained(_ index: Int) -> Bool {
for range in ranges {
if index > range.location && index < range.location + range.length - 1 {
return true
}
}
return false
}
var maskedString = String()
for (index, character) in self.enumerated() {
if isContained(index) {
maskedString.append(character)
} else {
if String(character).isDigit {
maskedString.append(replacementCharacter)
} else {
maskedString.append(character)
}
}
}
return maskedString
}
}
这些是我在上面的代码中使用的一些扩展:
extension String {
var isDigit: Bool {
CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: self))
}
func ranges(pattern: String) -> [NSRange] {
let regex = try! NSRegularExpression(pattern: pattern)
return regex.matches(in: self, options: [], range: NSRange(location: 0, length: self.count)).map { $0.range }
}
subscript (bounds: CountableClosedRange<Int>) -> String {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(startIndex, offsetBy: bounds.upperBound)
return String(self[start...end])
}
subscript (bounds: CountableRange<Int>) -> String {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(startIndex, offsetBy: bounds.upperBound)
return String(self[start..<end])
}
}
如果您只想屏蔽字符串中的任何数字(甚至括号内的数字),您可以简化为:
extension String {
func masked(replacementCharacter: Character = "*") -> String {
var maskedString = String()
for character in self {
if String(character).isDigit {
maskedString.append(replacementCharacter)
} else {
maskedString.append(character)
}
}
return maskedString
}
}
然后你可以像这样简单地使用它:
let input = "(123) 456-7890"
let output = input.masked()
// Prints (123) ***-****
推荐阅读
- node.js - 使用更漂亮的 onchange 自动格式化代码不起作用
- swift - 在 Swift 5 中使用 Decodables 在一个页面上执行多个 API 请求
- javascript - 如何使用 v-for 在 Vue.js 中生成描述列表 (dl)?
- c - 将字符串数组作为字符指针传递
- c++ - Linux中的Libcurl c ++分段错误(核心转储)
- jenkins - 如何集成 Amazon EKS 和 Jenkins
- amazon-web-services - 我可以在 EC2/GoogleCloud 上的两个云计算实例之间获得的最低延迟是多少?
- c# - 通过对象递归迭代
- laravel - RoleController.php 第 44 行中的 ErrorException:为 foreach() 提供的参数无效
- python - 如何可视化回归类型 CNN 的输出?