Swift 为什么退格键的 strcmp 返回-92?

2023-11-27

我试图检测 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
}
  1. 我不知道为什么退格键的cString结果是0。 我可以在 XCode 上进行调试。请检查屏幕截图。

enter image description here

  1. 我不知道为什么 strcmp 的退格键为 0(据我在 XCode 调试器上得到这个值)和“\b”字符返回 -92

enter image description here

我知道退格键的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
}

有谁可以一步步解释一下这段代码吗? 谢谢。

ref :

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
        }

让我们稍微分析一下代码和流经该代码的数据:

  1. string是一个空字符串,因为当您删除一个字符时,文本字段会尝试将其替换为“nothing”(空字符串)
  2. 由于#1,char仅保存字符串终止符,即\0, 在记忆中:[0]
  3. “\\b”翻译为\b字符串,在内存中:[92, 98]
  4. 由于#2和#3,strcmp返回 0 - 92 => -92。

不知道为什么人们使用这个“算法”,当他们可以简单地检查是否为空时string范围。我假设他们首先尝试使用\b转义序列,这似乎不是一个有效的序列,所以他们添加了一个额外的\字符,已编译,但导致不正确的转义序列,如\\是反斜杠字符的转义序列,结果是b部分被表示为普通字母。

委托方法似乎没有报告退格键,而是要求委托方法对字符串进行操作。检测实际的按键可能需要一些UIEvent/RunLoop hooks.

请注意,传递给的空字符串textField(_,shouldChangeCharactersIn:,replacementString:)并不总是意味着按下了退格键,剪切操作也可能导致将空字符串发送到委托。您可以尝试检查范围并假设对于 1 个退格键的范围,但用户也可以剪切一个字符...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 为什么退格键的 strcmp 返回-92? 的相关文章

随机推荐

  • instance_eval 的块参数 - 已记录?目的?

    刚刚意识到instance eval yields self作为关联块的参数 1 9 2 版本中的错误除外 http www ruby forum com topic 189422 1 9 3p194 003 gt class C end
  • 如何从 LINQ to XML 中的 XElement 读取特定元素值

    我有一个XElement其中有这样的内容
  • HTML:如何创建“另存为”按钮?

    在浏览器中 当您想要保存当前正在查看的 HTML 页面时 通常会转到 文件 菜单并单击 另存为 我可以在 HTML 页面底部添加一个具有相同功能的小按钮吗 因此 我希望我的用户能够单击按钮将页面保存到磁盘上 而不是转到 文件 菜单 gt 另
  • EF Core 2.0 Identity - 添加导航属性

    在 EF Core 2 0 中 默认情况下不包含 Identity 导航属性 因此在升级后 我添加了它们 因此 对于用户和角色之间的多对多关系以及角色和 RoleClaim 之间的一对多关系 我添加了以下导航属性 public class
  • 如何扩展Spring注解@Transactional

    我必须在我的网络应用程序中使用 3 个不同的事务管理器 所以我根据以下内容编写了自己的注释弹簧参考 第 10 5 6 3 节自定义快捷方式注释 一个注释 用于使用一个特定的事务管理器 如下所示 import java lang annota
  • 使用 PHP 删除文件夹中的所有文件?

    例如 我有一个名为 Temp 的文件夹 我想使用 PHP 删除或刷新该文件夹中的所有文件 我可以这样做吗 files glob path to temp get all file names foreach files as file it
  • Numpy 融合乘法和加法以避免浪费内存

    是否可以将两个 ndarray A 和 B 相乘并将结果添加到 C 而无需为 A 乘以 B 创建一个大型中间数组 Numpy 对于 C A 乘 B 的情况有 out 关键字参数 numpy multiply A B out C C A 乘以
  • SQL Server SORT 顺序与 ASCII 代码顺序不对应

    我正在使用 SQL Server 2012 并且我有一个数据库SQL Latin1 General CP1 CI AS整理 create table testtable c nvarchar 1 null insert into testt
  • 通过 USB 安装应用程序 [安装被用户取消]

    我可以通过 USB 将应用程序安装到我的 Android 设备上 但是 当 Android 上显示允许 拒绝安装弹出窗口时 我错误地单击了 拒绝 并选中了 记住我的选择 现在 每次尝试通过 USB ADB 安装应用程序都失败并出现错误com
  • UrlHelper.GenerateUrl 的 ASP.NET MVC 公共替代方案

    我想在我的页面中嵌入一个指向控制器操作的链接 以便我可以从 javascript 使用它 就像是 var pollAction Mycontroller CheckStatus 现在我很高兴对其进行硬编码 但如果有一种可以用来创建 URL
  • python中的快速寻峰和质心

    我正在尝试用 python 开发一种快速算法 用于查找图像中的峰值 然后找到这些峰值的质心 我使用 scipy ndimage label 和 ndimage find objects 编写了以下代码来定位对象 这似乎是代码中的瓶颈 在 5
  • Pojo 到 xsd 生成

    是否有一个库可以从 java 类生成 xsd 模式 Google 产生了很多相反的结果 来自 xsd 的 java 类 JAXB 2 0 允许您从带注释的 Java 类创建 XML 模式 您可以在以下位置找到一些示例AMIS 博客并在Jav
  • 如何在 iOS 推送通知上增加徽章

    我目前正在从有效负载中获取徽章 但我怎样才能更新这个值 aps alert Notification Hub test notification2 badge 1 sound Default 当我发送此消息时 徽章编号中始终显示 1 但是当
  • 批处理参数 %~s1 给出了错误的 8.3 短名称

    我正在尝试在 Windows XP 中编写一个批处理文件 该文件接受完全限定的路径名 并输出 8 3 短名称版本 echo off echo s1 我遇到过一种特殊情况 它输出不正确的路径和文件 C gt test bat C Docume
  • Angular-ui + D3:如何实现上下文菜单(弹出框与模式)?

    给出以下用例 我使用 D3js 来渲染由 AngularJS 管理的对象 我想为 D3 图表添加交互性 当单击 svg 元素时 我希望有一种弹出菜单 允许修改对象属性 这些属性是 AngularJS 所必需的 但 D3 不会呈现 D3 An
  • sys.path 与 $PATH

    我想从 python 程序内部访问 PATH 变量 到目前为止我的理解是 sys path 给出了 Python 模块搜索路径 但我想要的是 PATH 环境变量 有没有办法从Python内部访问它 为了提供更多背景知识 我最终想做的是找出用
  • 为什么“using”作用域可以在 Start-Job 本地工作,但不能与 Invoke-Command 一起工作?

    为什么 PowerShell 不允许使用using使用时范围Invoke Command本地 根据文档 the using修饰符只能用于远程命令 去引用 从 PowerShell 3 0 开始 您可以使用Using范围修饰符来标识远程命令中
  • 使用 rmongodb 在 R 中运行高级 MongoDB 查询

    由于 MySQL 让我抓狂 我试图让自己熟悉我的第一个 NoSQL DBMS 而它恰好是MongoDB 我通过以下方式连接到它rmongodb 我玩得越多rmongodb 关于运行高级查询的疑问 问题就越多 首先 我先展示一些示例数据 然后
  • Linux ldd 中的“静态链接”和“不是动态可执行文件”有什么区别?

    考虑这个 AMD64 汇编程序 globl start start xorl edi edi movl 60 eax syscall 如果我编译它gcc nostdlib并运行ldd a out 我明白了 statically linked
  • Swift 为什么退格键的 strcmp 返回-92?

    我试图检测 UITextfieldDelegate 内部的退格键 并找到了这个答案 https stackoverflow com a 49294870 911528 并且它工作正常 但我不知道这个函数内部发生了什么 let char st