You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中检测字符串单双引号?代码失效问题求助

问题分析与解决方案

你的代码核心问题出在可选值的处理逻辑上,强制解包的写法不仅不安全,还可能导致预期外的逻辑判断错误。我们一步步拆解问题:

问题所在

原代码中这一行的写法有明显隐患:

var usernameSQL = username.text?.contains("\'") as! Bool || username.text?.contains("\"") as! Bool
  1. 可选链+强制解包的风险:username.text?.contains(...) 返回的是 Bool?(可选布尔值),当 username.text 为 nil 时,强制解包 as! Bool 会直接崩溃;即使 text 有值,这种模糊的写法也容易让逻辑判断出现偏差。
  2. 逻辑判断失效的可能:虽然语法上看似正确,但可选值的隐式处理可能导致 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:12:22