Swift中是否有遵循Formatter协议的逗号过滤格式化器?
在Swift中实现过滤指定子串的Formatter
Swift标准库及系统框架里没有现成的、专门用于过滤指定子串的Formatter实现,你可以自定义一个遵循Formatter协议的类来满足需求,刚好适配SwiftUI中带Formatter参数的TextField初始化器。
自定义过滤Formatter实现
import Foundation class FilteringFormatter: Formatter { private let filterClosure: (String) -> String init(filter: @escaping (String) -> String) { self.filterClosure = filter super.init() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func string(for obj: Any?) -> String? { guard let inputString = obj as? String else { return nil } return filterClosure(inputString) } override func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool { let filteredString = filterClosure(string) obj?.pointee = filteredString as AnyObject return true } }
你的示例实现调整
按照你想要的方式,可以这样定义静态属性:
static let myCommaFilter: FilteringFormatter = { FilteringFormatter(filter: { input in input.replacingOccurrences(of: ",", with: "") }) }()
SwiftUI TextField使用示例
直接把这个自定义Formatter传入TextField即可实现输入时自动过滤逗号:
import SwiftUI struct ContentView: View { @State private var inputText = "" static let myCommaFilter: FilteringFormatter = { FilteringFormatter(filter: { $0.replacingOccurrences(of: ",", with: "") }) }() var body: some View { TextField("输入内容(自动过滤逗号)", text: $inputText, formatter: Self.myCommaFilter) .padding() .border(Color.gray) } }
这个自定义FilteringFormatter不仅可以过滤逗号,还能通过传入不同的闭包实现任意字符串替换逻辑,比如过滤其他符号或子串。
内容的提问来源于stack exchange,提问作者andrewz
相关产品推荐
相关产品推荐

