
我们可以从实现oisdk:s SwiftSequence
chunk(n:)方法的(版本号)的Swift
3版本开始:
Collection
extension Collection { public func chunk(n: IndexDistance) -> [SubSequence] { var res: [SubSequence] = [] var i = startIndex var j: Index while i != endIndex { j = index(i, offsetBy: n, limitedBy: endIndex) ?? endIndex res.append(self[i..<j]) i = j } return res }}在这种情况下,实现自定义格式是创建4个字符的块并将其通过“-”连接的简单情况:
func customStringFormatting(of str: String) -> String { return str.characters.chunk(n: 4) .map{ String(print(customStringFormatting(of: "5022222222222222")) // 5022-2222-2222-2222print(customStringFormatting(of: "50222222222222")) // 5022-2222-2222-22print(customStringFormatting(of: "5022222")) // 5022-222
) }.joined(separator: "-")}用法示例:
textField(_:shouldChangeCharactersIn:replacementString:)
如果适用于的
UITextFieldDelegate方法
customStringFormatting(of:),我们可能希望过滤掉
String方法中的现有分隔符,并将其实现为
extension String { func chunkFormatted(withChunkSize chunkSize: Int = 4, withSeparator separator: Character = "-") -> String { return characters.filter { let maxNumberOfCharacters = 16func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // only allow numerical characters guard string.characters.flatMap({ Int(String(// current 1234-1234-123// user paste:777777777 // will result in1234-1234-1237-7777
)) }).count == string.characters.count else { return false } let text = textField.text ?? "" if string.characters.count == 0 { textField.text = String(text.characters.dropLast()).chunkFormatted() } else { let newText = String((text + string).characters .filter({ != "-" }).prefix(maxNumberOfCharacters)) textField.text = newText.chunkFormatted() } return false} != separator }.chunk(n: chunkSize) .map{ String() }.joined(separator: String(separator)) }}扩展:并实现文本字段的受控更新,例如,如下所示:
上面的最后一部分将截断用户可能粘贴的字符串(假定它们都是数字的),例如
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)