Swift中将字符串转换为Int的5种方法:基准测试与优化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift中将字符串转换为Int:从基础到高性能

\n\n

每位iOS开发者迟早都会遇到一个看似简单的任务:将字符串转换为数字。乍一看,似乎再简单不过——Int("42")就完成了。但当应用处理成千上万个字符串、解析JSON日志或读取用户输入时,这一操作的性能就变得至关重要。

\n\n

在本文中,我们不仅会展示如何将Swift中的String转换为Int,还会进行深入探究:哪种方法更快?简单代码背后隐藏着哪些陷阱?如何编写在生产环境中可靠运行的优化Swift代码?

\n\n

本文内容基于Stack Overflow上一个热门问题(数千次浏览),并针对教育门户PythonLib进行了改编。开始吧!

\n\n

1. 基础方法:Int(string)

\n\n

最直观且Apple推荐的方法是使用初始化器Int(String)。它返回可选值Int?,非常安全:如果字符串不是数字,你会得到nil。

\n\n
let stringNumber = "123"\nif let number = Int(stringNumber) {\n    print("数字:\\(number)")\n} else {\n    print("转换失败")\n}
\n\n

优点:

\n
    \n
  • 代码可读性——所有方案中最佳。
  • \n
  • 安全性——可选类型防止崩溃。
  • \n
  • 支持不同进制:Int("FF", radix: 16)。
  • \n
\n\n

缺点:

\n
    \n
  • 性能——在批量操作中可能成为瓶颈。
  • \n
  • 不处理空格、货币符号、本地化数字。
  • \n
\n\n

这种方法适用于90%的场景。但如果你在编写日志解析器或处理百万行CSV文件——请继续往下看。

\n\n

2. 使用NumberFormatter:处理“脏”字符串

\n\n

现实世界并不完美。用户可能输入" 42 "、"$100"或"1 234.56"。这时NumberFormatter就派上用场了——功能强大但速度较慢。

\n\n
let formatter = NumberFormatter()\nformatter.numberStyle = .decimal\n\nif let number = formatter.number(from: " 1 234 ")?.intValue {\n    print(number) // 1234\n}
\n\n

使用场景:

\n
    \n
  • 解析本地化数字(欧洲格式"1.234,56")。
  • \n
  • 包含空格、货币、百分比的字符串。
  • \n
  • 用户可能输入任何内容的UI输入框。
  • \n
\n\n

但请记住:NumberFormatter很重。创建它的开销很大,因此务必将其缓存为静态变量,而不是为每个字符串重新创建。

\n\n

3. Scanner(NSScanner)——古老但快速

\n\n

来自Objective-C的经典方法——Scanner。它比NumberFormatter更快,但需要小心使用。

\n\n
let scanner = Scanner(string: "123abc")\nvar intValue: Int = 0\nif scanner.scanInt(&intValue) {\n    print("找到:\\(intValue)") // 123\n}
\n\n

Scanner从左到右扫描字符串,并在遇到第一个非数字字符时停止。如果你需要从包含杂质的字符串中“提取”数字,这很方便。

\n\n

基准测试提示:Scanner比NumberFormatter快3-5倍,但比简单的Int()慢2-3倍。非常适合解析混合数据。

\n\n

4. 自定义函数:手动解析以获得最高速度

\n\n

如果你在PythonLib上阅读本文,你肯定知道:当需要速度时——就自己动手。对于纯数字字符串(仅包含0-9字符,可能还有负号),可以编写自己的解析器。

\n\n
func fastInt(from string: String) -> Int? {\n    var result = 0\n    var isNegative = false\n    var started                

博客

书籍推荐