簡體   English   中英

Swift TextField 中隱藏的部分文本

[英]Partial text hiding in 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上創建擴展以屏蔽除國家/地區代碼以外的所有數字(圓括號之間的任何數字)。 請注意,這個 function 肯定會有一些性能改進,但我希望它至少可以幫助您入門:

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) ***-****

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM