swift - Swift为什么退格的strcmp返回-92?
问题描述
我试图检测 UITextfieldDelegate 内的退格键。并找到了这个答案。 https://stackoverflow.com/a/49294870/911528
它工作正常。
但我不知道这个函数内部发生了什么。
let char = string.cString(using: String.Encoding.utf8)!
let isBackSpace = strcmp(char, "\\b")
if isBackSpace == -92 {
print("Backspace was pressed")
return false
}
- 我不知道为什么退格的 cString 的结果是 0。我可以在 XCode 上调试。请检查屏幕截图。
- 我不知道为什么退格的 strcmp 大约为 0(据我在 XCode 调试器上得到这个值)和“\b”字符返回 -92
我知道退格的 ascii 代码是 int 类型的“8”,所以我认为上面的函数会像下面的代码一样。
// I thought this char would be "\b" of type char or 08 of type int
// but XCode give the value 0... I don't know why
let char = string.cString(using: String.Encoding.utf8)!
// as far as I know, strcmp returns positive value for equal values.
let isBackSpace = strcmp(char, "\\b")
// so I thought this would be
if isBackSpace > 0 {
print("Backspace was pressed")
return false // or true
}
有谁可以逐步解释此代码?谢谢你。
参考:
https://linux.die.net/man/3/strcmp
https://theasciicode.com.ar/ascii-control-characters/backspace-ascii-code-8.html
现在我可以理解为什么人们使用那个代码了,而上面的代码是不正确的。
尝试通过参考@Cristik 的答案来正确编辑。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// backspace checking
if string == "" {
return true // or false
}
解决方案
让我们稍微分析一下代码和流经该代码的数据:
string
是一个空字符串,当您删除一个字符时,文本字段会尝试用“nothing”(空字符串)替换它- 由于#1,
char
仅在内存中保存字符串终止符,即\0
:[0]
- "\\b"
\b
在内存中转换为字符串:[92, 98]
- 由于 #2 和 #3,
strcmp
返回 0 - 92 => -92。
不确定人们为什么使用这种“算法”,因为他们可以简单地检查string
参数是否为空。我假设他们首先尝试使用\b
转义序列,这似乎不是一个有效的,所以他们添加了一个额外的\
字符,该字符已编译,但导致转义序列不正确,\\
反斜杠字符的转义序列也是如此,导致该b
部分被表示为纯字母。
似乎委托方法没有报告退格,而是要求委托方法对字符串进行操作。检测实际的按键可能需要一些UIEvent
/RunLoop
钩子。
请注意,传递给的空字符串textField(_,shouldChangeCharactersIn:,replacementString:)
并不总是意味着按下退格键,剪切操作也可能导致将空字符串发送给委托人。您可以尝试检查范围并假设按下了 1 个退格键,但是用户也可以剪切一个字符...
推荐阅读
- javascript - 如果检查该变量是否为布尔值的语句会导致 "boolean != boolean"
- swift - SwiftUI:防止 Image() 将视图矩形扩展到屏幕边界之外
- dynamics-crm - 分配的自动共享不会触发 GrantAccess
- python - 如何通过经过身份验证的 HTTP 代理通过 SSH 执行远程命令?
- python - 用于手写和徽标的 OCR / ICR
- c++ - if == 计算是否比 if 快
在 IT 额外课程中,有人告诉我,
if ==
计算速度比我学校if <
的if >
一名高年级学生更快。这是真的?
- java - 设置嵌套在地图中的地图的值
- python - 为什么 logging.handlers.RotatingFileHandler 打印未知字符?
- java - @Value 属性名称中的转义“(双引号)
- c# - 运行 Blazor 网站时出现表单布局错误