swift - 为什么我们应该使用 String.Index 而不是 Int 作为 String 中 Character 的索引?

标签 swift swift5

我已阅读有关 String 的文档和 统一码 在 Swift 5 中,但不明白为什么我们不能得到 Character来自 String作为:

let someString = "🍏🍐🍓🥭"
let oneCharacter = someString[2] // Error

为什么我们要使用更复杂的方法来获取 Character ?

let strawberryIndex = someString.index(someString.startIndex, offsetBy: 2) // String.Index type
someString[strawberryIndex] // Character(🍓)

使用 String.Index 类型有什么意义?

最佳答案

首先,您不能使用 Int 作为字符串的索引。该接口(interface)需要 String.Index。

为什么?我们使用的是 Unicode,而不是 ASCII。 Swift 字符串的单位是 Character,即“Grapheme Cluster”。一个字符可以由多个 Unicode 码点组成,每个 Unicode 码点可以由 1 到 4 个字节组成。

现在假设您有一个 10 兆字节的字符串,并进行了搜索以找到子字符串“Wysteria”。您想返回字符串以哪个字符开头的数字吗?如果是第 123,456 个字符,那么要再次找到相同的字符串,我们必须从字符串的开头开始,分析 123,456 个字符以找到该子字符串。这是非常低效的。

相反,我们得到一个 String.Index,它允许 Swift 快速定位该子字符串。它很可能是字节偏移量,因此可以非常快速地访问它。

现在将“1”添加到该字节偏移量是无意义的,因为您不知道第一个字符有多长。 (Unicode 很可能有另一个字符等于 ASCII 'W')。所以你需要调用一个函数来返回下一个字符的索引。

您可以编写从字符串返回第二个字符的代码。返回第 100 万个字符需要大量时间。 Swift 不允许你做非常低效的事情。

关于swift - 为什么我们应该使用 String.Index 而不是 Int 作为 String 中 Character 的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61122298/

相关文章:

ios - 第二个 ViewController 中的错误 'doneAccessory' 的重新声明无效

swift - 无法在 google plus ios sdk 中检索性别

ios - swift 位置管理器

swift 5 : 'self' used before 'self.init' call

ios - UIScrollView 内不可滚动的 UITableView

ios - 按需重新加载 UITabBarController

ios - 使用乘数的 Swift 约束使用尾随但不使用前导

ios - 自动将 UIView 的角半径设置为 View 宽度的一半

xcode - 使用 Swift 通过 iPhone 扬声器强制播放音频文件

ios - 错误域=NSCocoaErrorDomain 代码=-1 "(null)"移动.mov 到相机胶卷时