Swift 4中检测字符串单双引号?代码失效问题求助
问题分析与解决方案
你的代码核心问题出在可选值的处理逻辑上,强制解包的写法不仅不安全,还可能导致预期外的逻辑判断错误。我们一步步拆解问题:
问题所在
原代码中这一行的写法有明显隐患:
var usernameSQL = username.text?.contains("\'") as! Bool || username.text?.contains("\"") as! Bool
- 可选链+强制解包的风险:
username.text?.contains(...)返回的是Bool?(可选布尔值),当username.text为nil时,强制解包as! Bool会直接崩溃;即使text有值,这种模糊的写法也容易让逻辑判断出现偏差。 - 逻辑判断失效的可能:虽然语法上看似正确,但可选值的隐式处理可能导致
contains的结果没有被正确解析,使得usernameSQL始终为false,从而跳过了警告弹窗的触发逻辑。
修复后的代码
我们先安全解包输入文本,再检查非法符号,这样逻辑更清晰且无崩溃风险:
// 先确保输入文本不为空 guard let inputText = username.text else { print("Please enter a username") return } // 检查是否包含非法符号(单引号/双引号) let hasInvalidSymbols = inputText.contains("'") || inputText.contains("\"") guard !hasInvalidSymbols else { let alertVC = UIAlertController(title: "Invalid symbols", message: "(') and (\") symbols are not allowed", preferredStyle: .alert) alertVC.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.show(alertVC, sender: nil) return } print("passed")
额外优化建议
- 单引号在Swift字符串中不需要转义,直接写
"'即可,双引号需要转义为"\"",这样代码可读性更好。 - 如果需要检查更多非法符号,可以用字符集合来简化逻辑,比如:
let invalidChars = CharacterSet(charactersIn: "'\"") let hasInvalidSymbols = inputText.rangeOfCharacter(from: invalidChars) != nil
这样修改后,当你输入单引号或双引号时,就能正常触发警告弹窗了。
内容的提问来源于stack exchange,提问作者el3ankaboot
相关产品推荐
相关产品推荐

