gpt4 book ai didi

String.Index(_ :within:) initializer crashing

转载 作者:搜寻专家 更新时间:2023-11-01 07:32:08 24 4
gpt4 key购买 nike

最近我一直在弄乱 String 索引,我很难弄明白,但有些事情仍然困扰着我。

我正在尝试使用 init(_:within:) 类型为 String.Index 的方法。当我在字符串边界内使用 utf16index 时效果很好,但在字符串边界外时它会崩溃并显示此消息:

fatal error: Invalid String.UTF16Index for this UnicodeScalar view

现在我知道这是对文档中所述功能的要求:

/// - Requires: `utf16Index` is an element of
/// `characters.utf16.indices`.

实际问题:我不明白的是为什么当这个 init 是一个可失败的初始化器时会崩溃?它不应该返回 nil 吗?

我可能会创建一个方法来检查索引是否可以在字符串中,但对我来说这仍然很奇怪。

最佳答案

该方法的完整头文档是

extension String.CharacterView.Index {

// ...

public init?(_ unicodeScalarIndex: UnicodeScalarIndex, within characters: String)
/// Construct the position in `characters` that corresponds exactly to
/// `utf16Index`. If no such position exists, the result is `nil`.
///
/// - Requires: `utf16Index` is an element of
/// `characters.utf16.indices`.
public init?(_ utf16Index: UTF16Index, within characters: String)

// ...

}

所以有两种不同的失败原因:

  • 给定的 utf16Index 超出了有效索引的范围字符.utf16。这违反了要求并导致运行时异常(exception)。
  • 给定的 utf16Indexcharacters.utf16 的有效索引,但是没有与该索引对应的字符位置。在这种情况下,该方法返回 nil

例如,考虑字符串“a👿b”。它由三个字符组成,但是四个 UTF-16 代码单元:

let str = "a👿b"
str.characters.count // 3
str.utf16.count // 4
Array(str.utf16) // [97, 55357, 56447, 98]

(另见 Strings in Swift 2在 Swift 博客中。)

UTF-16索引013对应一个有效的字符位置,但是 2 不会:

String.Index(str.utf16.startIndex, within: str) // 0
String.Index(str.utf16.startIndex + 1, within: str) // 1
String.Index(str.utf16.startIndex + 2, within: str) // nil
String.Index(str.utf16.startIndex + 3, within: str) // 3

实际上“最后一个”位置(utf16.endIndex)也是有效的(这对我来说并不明显来自 header 文档),在这种情况下返回 characters.endIndex:

String.Index(str.utf16.startIndex + 4, within: str) // 4
str.characters.endIndex // 4

但是 endIndex 之外的所有内容都会导致运行时异常:

String.Index(str.utf16.startIndex + 5, within: str) // EXC_BAD_INSTRUCTION

要计算有效范围内的 UTF-16 索引,您可以使用advance()

的三参数形式
let i16 = advance(str.utf16.startIndex, offset, str.utf16.endIndex)

关于String.Index(_ :within:) initializer crashing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31913848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com