我想在 Swift 内找到可以模拟 std::string_view 的方法

2022-05-07 13:27:34 +08:00
 ShikiSuen

请教一个 Swift 问题:

假设 strRawData 是某个文本档案的全部内容,用 pseudo code 说明一下:

arrRawData = strRawData.components(separatedBy: " ") // 用一个 ASCII 空格分开

for neta in arrRawData { 请问在这里该怎样获取 neta 相对于 strRawData 的 startIndex 和 endIndex ? (两者的类别都是 String.Index 或任何更适合的类型。) }

问这个问题的原因是我想在 Swift 内找到可以模拟 std::string_view 的方法。

4111 次点击
所在节点    iDev
7 条回复
chipmuck
2022-05-07 14:22:51 +08:00
```swift
let abc = "aaaa bbbb cccc dddd eeee ffff"

let comps = abc.components(separatedBy: " ")
for element in comps {
let startIndex = abc.range(of: element)?.lowerBound
let endIndex = abc.range(of: element)?.upperBound
// ...
}
```

像这样?
kaitok
2022-05-07 17:50:31 +08:00
@chipmuck 没写过 swift ,不过这样时间复杂度是不是有点高?
MrKrabs
2022-05-07 20:24:18 +08:00
let array = ["a", "b", "", "c"]
let str = array.joined(separator: " ")
let splited = str.split(separator: " ", omittingEmptySubsequences: false)
splited.forEach { sub in
print(str.distance(from: str.startIndex, to: sub.startIndex), str[sub.startIndex..<sub.endIndex])
}
要省空间用 lazy split https://github.com/apple/swift-algorithms/blob/main/Guides/Split.md
shoujiaxin
2022-05-07 21:02:30 +08:00
用 split 试试?返回的是 Substring 的数组,Substring 和原 String 共享文本存储,Substring 的 startIndex 应该就是原 String 的索引
ShikiSuen
2022-05-08 12:06:52 +08:00
@shoujiaxin @MrKrabs
谢谢二位。不知道这样处理是否可以正常处理包含 Emoji 的内容。

```
let strData = #"""
# Comment: These are test data
treeNewBee 🌳🐮🍺 -0.1145141919810
cowbeer 🐂🍺 -2.390804
"""#
```
shoujiaxin
2022-05-08 13:14:44 +08:00
@ShikiSuen Swift 的字符串是尽可能保证 Unicode 正确的
ShikiSuen
2022-05-08 23:27:31 +08:00
@shoujiaxin 太感謝了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851345

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX