我有一个文本字段,判断是在shouldChangeCharactersIn函数中完成的.

首先,我有一组允许的字符:

// Check characters
allowedCharacters = CharacterSet.decimalDigits.union(.letters)
allowedCharacters = allowedCharacters?.union(CharacterSet(charactersIn: "àÀáÁâÂãÃäÄåāÅæèÈéÉêÊëËìÌíÍîÎïÏòÒóÓöÖôÔõÕøØùÙúÚûÛüÜýÝÿçÇñÑ"))
allowedCharacters = allowedCharacters?.union(CharacterSet(charactersIn: " ,.:;@#%*+&_=<>!?\r\n'(){}[]/-"))

allowedCharacters变量现在保存我希望在应用程序中允许的所有字符.trimminCharacters删除不在允许集中的所有字符.

guard string.trimmingCharacters(in: allowedCharacters!) == "" else { return false }

这似乎工作正常,但当用户将键盘切换为土耳其语或中文时,可能会输入上面列表中没有的字符.

我想阻止所有不在允许的字符集中的字符.如何防止用户输入这些字符?

推荐答案

letters个字符集包括类别以"L"或"M"开头的每个unicode标量.

ğ和ş都属于Ll类(小写字母)和Bopomofo符号ㄎ ㄕ 和ㄨ 都属于Lo类(其他字母).所有这些字符都在letter个字符集中!

请注意,同样的情况也适用于decimalDigits,其中包括类别Nd中的所有内容.例如,这包括印度-阿拉伯数字٠١٢٣٤٥٦٧٨٩.

您似乎有一组非常特定的字符需要允许,所以您应该明确地写出来:

CharacterSet(charactersIn: "a"..."z") // assuming these chars are what you want
    .union(.init(charactersIn: "A"..."Z"))
    .union(.init(charactersIn: "0"..."9"))
    .union(.init(charactersIn: "àÀáÁâÂãÃäÄåāÅæèÈéÉêÊëËìÌíÍîÎïÏòÒóÓöÖôÔõÕøØùÙúÚûÛüÜýÝÿçÇñÑ"))
    .union(.init(charactersIn: " ,.:;@#%*+&_=<>!?\r\n'(){}[]/-"))

Swift相关问答推荐

在运行时检测蒸汽工人的类型

通过SwiftUI中的列表 Select 从字典中检索值

SWIFT闭包使用的是陈旧的值,即使它是S@转义

如何在AudioKit中实现自定义音效 node ?

NSApplication是否需要NSApplicationDelegate?

声明一个协议时使用和不使用任何单词有什么区别?

解码器是否需要具有密钥的外部数据表示?

在 SwiftUI 视图中观察 UIViewRepresentable 的 @State var 变化

使用View()和List()无法显示影子

在 Swift 5.7 中使用协议作为类型时什么时候需要写 `any`

SwiftUI:按钮的圆形边缘的边框尺寸加倍

如何延迟 swift 属性 didSet 使其每秒只触发一次

将每个枚举 case 与 Swift 中的一个类型相关联

无法使用 RealityKit 播放 USDZ 动画

如何在不提交到应用store 的情况下在本地运行我的应用

iOS16 Bug 键盘在表单解雇 SwiftUI 时打破布局

将if let与逻辑或运算符一起使用

你如何在 UIBarItem 中使用 setTitleTextAttributes:forState?

如何快速识别字符串中的大写和小写字符?

如何在 Swift 中从字符串创建类的实例