当前位置: 首页 > 知识库问答 >
问题:

得到"字符串。索引”同时枚举swft字符串

邢皓
2023-03-14

目前我们迭代字符串如下:

let greeting = "Hello"
for (intIndex, char) in greeting.enumerated() {
    let currentIndex = greeting.index(greeting.startIndex, offsetBy: intIndex)
    let indexAfterCurrentIndex = greeting.index(after: currentIndex)
    print(greeting[indexAfterCurrentIndex...])
}

我觉得写下面的代码是多余的。

let currentIndex = greeting.index(greeting.startIndex, offsetBy: intIndex)

有没有其他方法可以在迭代时直接获取“String.Index”?

像这样的东西

let greeting = "Hello"
for (stringIndex, char) in greeting.enumeratedXXX() {
    let indexAfterCurrentIndex = greeting.index(after: stringIndex)
    print(greeting[indexAfterCurrentIndex...])
}

共有3个答案

霍修筠
2023-03-14

为什么不将currentIndex增加1?

let greeting = "Hello"
for (stringIndex, char) in greeting.enumerated() {
    let currentIndex = stringIndex
    let nextIndex = currentIndex + 1
    print(nextIndex)
}
宦子琪
2023-03-14

如果需要字符串索引,可以枚举greeting.indices

let greeting = "Hello"
for index in greeting.indices {
    // ...
}

如果您需要每个字符及其索引,那么您可以并行枚举字符串和索引:

let greeting = "Hello"
for (char, currentIndex) in zip(greeting, greeting.indices) {
    let indexAfterCurrentIndex = greeting.index(after: currentIndex)
    print(char, "-", greeting[indexAfterCurrentIndex...])
}

输出:

H - ello
e - llo
l - lo
l - o
o -

一个更简单的变体是

let greeting = "Hello"
for (char, nextIndex) in zip(greeting, greeting.indices.dropFirst()) {
    print(char, "-", greeting[nextIndex...])
}

这会产生几乎相同的结果,只是没有最后一个字符/索引对:

H - ello
e - llo
l - lo
l - o
汤嘉平
2023-03-14

这没有内置的功能。您可以将其封装在自定义迭代器中,但是您只能将相同类型的计算封装在不同的位置,因此这不是答案:)

但是,您可以提高当前代码的性能:

greeting.index(greeting.startIndex, offsetBy: intIndex)
  • 这将计算从startIndex到每个循环迭代的结果索引的索引

因此,对于n迭代,您自己的外循环与O(n)成线性关系,每个字符对应一个循环。

然后用内环计算索引意味着有123456…n=(n^2n)/2迭代,其中n是这种情况下的intIndex

这意味着该算法的复杂度为*手动放弃*迂回O(n n^2)。二次部分有问题!

您可以将复杂性降低到每次迭代2个操作,或者O(2n)。只需将先前计算的索引保存在内存中,并自己保存1,避免从头开始重新计算。

代码如下:

let greeting = "Hello"
var index = greeting.startIndex
for char in greeting {
    let indexAfterCurrentIndex = greeting.index(after: index)
    print(greeting[indexAfterCurrentIndex...])
    index = indexAfterCurrentIndex
}

仍然不是一个简单的内置解决方案,但您可以包装这个更有效的算法,然后开始!

extension String {
    func forEachCharacterWithIndex(iterator: (String.Index, Character) -> Void) {
        var currIndex = self.startIndex
        for char in self {
            iterator(currIndex, char)
            currIndex = self.index(after: currIndex)
        }
    }
}

let greeting = "Hello"
greeting.forEachCharacterWithIndex { (index, char) in
    let indexAfterCurrentIndex = greeting.index(after: index)
    print(greeting[indexAfterCurrentIndex...])
}
 类似资料:
  • 本文向大家介绍C#枚举到字符串并返回,包括了C#枚举到字符串并返回的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 我觉得这是一个简单的问题,但是我尝试过的所有事情都不适合我。我有一个枚举,我有字符串构造函数的原因是因为Java不允许枚举为数字..我在没有字符串构造函数的情况下直接尝试了AA,AB,2C,但这给出了错误。请注意,对于现有的枚举,我要添加C(“ 2C”)。 现在我有一个mybatis映射器,它会进行合并,这是现有的,并且映射器的参数之一是TestEnum。到目前为止,由于枚举值和字符串

  • 我有一种情况,我试图对一些数据进行二进制解码,数据类型既有数值,也有字符串值和名称。我正在考虑使用枚举,例如: 然而,我也知道: 或者举另一个例子: 是否有一种方法可以将此结构重构为枚举,以便我用整数值构造枚举,但我将枚举“读”为字符串?我很确定答案是否定的。

  • 因此,进一步寻找,我发现这个人有一个解决方案:typescript中基于字符串的枚举的解决方案 这将允许像这样的东西工作: 唯一的回应基本上是说这样做是不安全的。(但我应该说,它确实起作用了--我可以键入eventtype.dot...Atom editor给了我5个大小写选项可供选择(保持代码中的内容一致),然后我可以使用它将字符串值吐出来,给我的用户一个很好的填充空间的体验,将来我可以更改枚举

  • 例如,我如何做类似的事情: 结果示例: