“我的 .trim() 在哪?”—— 或者为什么 Swift 不是 Python
\n\n如果您是从 Python 或 JavaScript 转到 Swift,那么您一定习惯了简单地调用 " hello ".trim() 或 " hello ".strip()。当您编写第一个 Swift 代码,尝试做同样的事情时,却遇到了编译错误。是不是很熟悉?
在 Stack Overflow 上,这个问题获得了数千次浏览,这并非没有原因。在 Swift 中,字符串 没有 .trim() 方法。但这并不意味着不能修剪空格和字符。只是方法不同——更符合 Swift 的方式。让我们一劳永逸地弄清楚。
在本文中,我们不仅会回答主要问题,还会展示 真实的代码示例,您可以立即将其插入到您的项目中。开始吧!
\n\n简短回答:有,但不像您习惯的那样
\n\n在 Swift 中,没有单一的 .trim() 方法。取而代之的是使用来自 Foundation 协议的一系列方法:
- \n
trimmingCharacters(in:)— 主要工具 \n .trimmingCharacters(in: .whitespacesAndNewlines)— 最常用的选项 \n
听起来很简单?实际上,这提供了 灵活性:您可以自己决定要修剪哪些字符,而不是依赖内置方法的“魔法”。
\n\ntrimmingCharacters 如何工作——通过示例解析
\n\n基本示例:删除空格和换行符
\n\nimport Foundation\n\nlet text = " 你好,Swift! \\n"\nlet trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines)\nprint(trimmed) // "你好,Swift!"\n\n请注意:我们 必须 导入 Foundation。没有它,该方法不可用,因为它是在 NSString 中定义的,并通过桥接“混入”到 Swift 字符串中。
仅空格(不删除换行符)
\n\nlet textWithNewline = " Hello\\n"\nlet onlySpacesTrimmed = textWithNewline.trimmingCharacters(in: .whitespaces)\nprint(onlySpacesTrimmed) // "Hello\\n"\n\n看到了吗?换行符保留了下来。当您想保留格式但去掉边缘多余的空格时,这很方便。
\n\n修剪任意字符
\n\n在 CharacterSet 中,您可以传递任何字符集:
let email = " user@example.com "\nlet cleaned = email.trimmingCharacters(in: .whitespaces)\nprint(cleaned) // "user@example.com"\n\nlet price = "$99.99"\nlet noDollar = price.trimmingCharacters(in: CharacterSet(charactersIn: "$"))\nprint(noDollar) // "99.99"\n\n那 trimLeft / trimRight (ltrim / rtrim) 呢?
\n\n在 Python 中有 .lstrip() 和 .rstrip()。在 Swift 中——没有。但这很容易手动实现。以下是两个简单的扩展,您可以添加到您的项目中:
import Foundation\n\nextension String {\n func trimmingLeft(in characterSet: CharacterSet = .whitespacesAndNewlines) -> String {\n var start = startIndex\n while start < endIndex, characterSet.contains(self[start].unicodeScalars.first!) {\n formIndex(after: &start)\n }\n return String(self[start..<endIndex])\n }\n \n func trimmingRight(in characterSet: CharacterSet = .whitespacesAndNewlines) -> String {\n var end = endIndex\n while end > startIndex, characterSet.contains(self[index(before: end)].unicodeScalars.first!) {\n formIndex(before: &end)\n }\n return String(self[startIndex..<end])\n }\n}\n\n// 使用示例:\nlet text = " Hello World "\nprint(text.trimmingLeft()) // "Hello World "\nprint(text.trimmingRight()) // " Hello World"\n\n现在,您拥有了像在您喜爱的 Python 中一样完整的 trimLeft 和 trimRight。将此代码保存到单独的文件中——以后会用到。