当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift String.Index init(_:within:)用法及代码示例


用法一

初始化器

init(_:within:)

在给定的 UTF-16 视图中创建与指定字符串位置完全对应的索引。

声明

init?(
    _ idx: String.Index,
    within target: String.UTF16View
)

参数

sourcePosition

target 共享的字符串的至少一个视图中的位置。

target

找到新位置的UTF16View

详述

如果作为 sourcePosition 传递的索引表示 Unicode 标量值的开始或 UTF-16 尾随代理项的位置,则初始化程序成功。如果 sourcePositiontarget 中没有精确对应的位置,则结果为 nil 。例如,尝试转换 UTF-8 连续字节的位置会导致 nil

以下示例查找字符串中空格的位置,然后将该位置转换为字符串的 utf16 视图中的索引。


let cafe = "Café 🍵"


let stringIndex = cafe.firstIndex(of: "é")!
let utf16Index = String.Index(stringIndex, within: cafe.utf16)!


print(String(cafe.utf16[...utf16Index])!)
// Prints "Café"

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

用法二

初始化器

init(_:within:)

在给定字符串中创建与指定位置完全对应的索引。

声明

init?(
    _ sourcePosition: String.Index,
    within target: String
)

参数

sourcePosition

target 参数视图中的位置。 sourcePosition 必须是 target 的至少一个视图的有效索引。

target

结果索引引用的字符串。

详述

如果作为sourcePosition 传递的索引表示扩展字素簇的开始——字符串的元素类型——则初始化程序成功。

以下示例将 Unicode 标量 "e" 的位置转换为其在字符串中的对应位置。该位置的字符是组合的"é" 字符。


let cafe = "Cafe\u{0301}"
print(cafe)
// Prints "Café"


let scalarsIndex = cafe.unicodeScalars.firstIndex(of: "e")!
let stringIndex = String.Index(scalarsIndex, within: cafe)!


print(cafe[...stringIndex])
// Prints "Café"

如果作为 sourcePosition 传递的索引在 target 中没有精确对应的位置,则初始化程序的结果是 nil 。例如,尝试转换组合锐音符 ("\u{0301}") 的位置失败。组合 Unicode 标量在字符串中没有自己的位置。


let nextScalarsIndex = cafe.unicodeScalars.index(after: scalarsIndex)
let nextStringIndex = String.Index(nextScalarsIndex, within: cafe)


print(nextStringIndex)
// Prints "nil"

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

用法三

初始化器

init(_:within:)

在给定字符串中创建与指定位置完全对应的索引。

声明

init?<S>(
    _ sourcePosition: String.Index,
    within target: S
) where S : StringProtocol

参数

sourcePosition

target 参数视图中的位置。 sourcePosition 必须是 target 的至少一个视图的有效索引。

target

结果索引引用的字符串。

详述

如果作为sourcePosition 传递的索引表示扩展字素簇的开始——字符串的元素类型——则初始化程序成功。

以下示例将 Unicode 标量 "e" 的位置转换为其在字符串中的对应位置。该位置的字符是组合的"é" 字符。


let cafe = "Cafe\u{0301}"
print(cafe)
// Prints "Café"


let scalarsIndex = cafe.unicodeScalars.firstIndex(of: "e")!
let stringIndex = String.Index(scalarsIndex, within: cafe)!


print(cafe[...stringIndex])
// Prints "Café"

如果作为 sourcePosition 传递的索引在 target 中没有精确对应的位置,则初始化程序的结果是 nil 。例如,尝试转换组合锐音符 ("\u{0301}") 的位置失败。组合 Unicode 标量在字符串中没有自己的位置。


let nextScalarsIndex = cafe.unicodeScalars.index(after: scalarsIndex)
let nextStringIndex = String.Index(nextScalarsIndex, within: cafe)


print(nextStringIndex)
// Prints "nil"

可用版本

iOS 13.0+, iPadOS 13.0+, macOS 10.15+, Mac Catalyst 13.0+, tvOS 13.0+, watchOS 6.0+

用法四

初始化器

init(_:within:)

在给定的 UTF-8 视图中创建与指定的 UTF16View 位置完全对应的索引。

声明

init?(
    _ idx: String.Index,
    within target: String.UTF8View
)

参数

sourcePosition

String 或其视图之一中的位置。

target

找到新位置的UTF8View

详述

以下示例在字符串的 utf16 视图中查找空格的位置,然后将该位置转换为字符串的 utf8 视图中的索引。


let cafe = "Café 🍵"


let utf16Index = cafe.utf16.firstIndex(of: 32)!
let utf8Index = String.UTF8View.Index(utf16Index, within: cafe.utf8)!


print(Array(cafe.utf8[..<utf8Index]))
// Prints "[67, 97, 102, 195, 169]"

如果在 utf16Index 中传递的位置在 utf8 中没有精确对应的位置,则初始化器的结果是 nil 。例如,由于 UTF-8 和 UTF-16 以不同的方式表示高 Unicode 代码点,因此尝试转换 UTF-16 代理项对的尾随代理项的位置会失败。

下一个示例尝试转换代表茶杯表情符号 ("🍵") 的两个 UTF-16 代码点的索引。前导代理的索引已成功转换为 utf8 中的位置,但尾随代理的索引不是。


let emojiHigh = cafe.utf16.index(after: utf16Index)
print(String.UTF8View.Index(emojiHigh, within: cafe.utf8))
// Prints "Optional(String.Index(...))"


let emojiLow = cafe.utf16.index(after: emojiHigh)
print(String.UTF8View.Index(emojiLow, within: cafe.utf8))
// Prints "nil"

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

用法五

初始化器

init(_:within:)

在给定的 Unicode 标量视图中创建与指定的 UTF16View 位置完全对应的索引。

声明

init?(
    _ sourcePosition: String.Index,
    within unicodeScalars: String.UnicodeScalarView
)

参数

sourcePosition

字符串的utf16 视图中的位置。 utf16Index 必须是 String(unicodeScalars).utf16.indices 的一个元素。

unicodeScalars

找到新位置的UnicodeScalarView

详述

以下示例在字符串的 utf16 视图中查找空格的位置,然后将该位置转换为字符串的 unicodeScalars 视图中的索引:


let cafe = "Café 🍵"


let utf16Index = cafe.utf16.firstIndex(of: 32)!
let scalarIndex = String.Index(utf16Index, within: cafe.unicodeScalars)!


print(String(cafe.unicodeScalars[..<scalarIndex]))
// Prints "Café"

如果作为 sourcePosition 传递的索引在 unicodeScalars 中没有精确对应的位置,则初始化程序的结果是 nil 。例如,尝试转换 UTF-16 代理对的尾随代理的位置会导致 nil

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 String.Index init(_:within:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。