【问题标题】:How to convert Int to String.CharacterView.Index如何将 Int 转换为 String.CharacterView.Index
【发布时间】:2024-01-09 08:58:01
【问题描述】:

这让我发疯了。

在 Swift 2.2 中,无法将 String 下标为 Int。例如:

let myString = "Test string"
let index = 0
let firstCharacter = myString[index]

这将导致编译错误,说

'subscript' 不可用:不能用 Int 为 String 下标,请参阅文档注释进行讨论

我看到的一种解决方法是将整数转换为索引类型,但我不知道如何..

【问题讨论】:

标签: string swift2 subscript swift2.2


【解决方案1】:

下标不一定是不可能的,只需要多做一步就可以得到和以前一样的结果。下面,我和你做了同样的事情,但是在 Swift 2.2

let myString = "Test string"
let intForIndex = 0
let index = myString.startIndex.advancedBy(intForIndex)
let firstCharacter = myString[index]

Swift 3.x + 4.x

let myString = "Test string"
let intForIndex = 0
let index = myString.index(myString.startIndex, offsetBy: intForIndex)
let firstCharacter = myString[index]

编辑 1:

更新了代码,以便您可以使用在其他地方传递到“索引”值的Int


语法编辑:

我会不断更新这个答案以支持最新版本的 Swift。

【讨论】:

  • 这可以解决问题,但是换一种方式呢?
  • 取一个 .Index 类型并将其转换为 Int。
  • 您是要直接将Index 转换为Int,还是要使用IntString 中查找字符?
  • 不可用于其他用途。我需要一个 int,这样我就可以根据字符在相应索引处操作另一个数组。我结束了将 CharacterView 映射到 Characters 数组然后使用它。仍然不理想,因为它浪费了转换时间:(
  • 我已经更新了我的答案,以便您可以重新使用传递给“索引”的Int
【解决方案2】:

这也让我很恼火,所以我写了一个扩展来处理它:

extension String {
    subscript (index: Int) -> Character {
        let charIndex = self.startIndex.advancedBy(index)
        return self[charIndex]
    }

    subscript (range: Range<Int>) -> String {
        let startIndex = self.startIndex.advancedBy(range.startIndex)
        let endIndex = startIndex.advancedBy(range.count)

        return self[startIndex..<endIndex]
    }
}

// Usage
let str = "Hello world"

print(str[0])       // H
print(str[0..<5])   // Hello

为 Swift 4.x 更新:

extension String {
    subscript (index: Int) -> Character {
        let charIndex = self.index(self.startIndex, offsetBy: index)
        return self[charIndex]
    }

    subscript (range: Range<Int>) -> Substring {
        let startIndex = self.index(self.startIndex, offsetBy: range.startIndex)
        let stopIndex = self.index(self.startIndex, offsetBy: range.startIndex + range.count)
        return self[startIndex..<stopIndex]
    }

}

let s = "?‍?‍?‍? family"

print(s[0])      // ?‍?‍?‍?
print(s[2..<8])  // family

【讨论】:

  • 没有扩展的解决方案会是什么样子?
【解决方案3】:

ZGski 答案已更新至 Swift 3

let testText = "Test text 123"  
let position = 11  
let index = testText.characters.index(testText.startIndex, offsetBy: position)  
let character = testText[index] // "2"

【讨论】:

    【解决方案4】:

    swift 4 的示例:

    let myString = "Test string"
    let index = 0
    let firstCharacter = myString[String.Index(encodedOffset: index)]
    

    【讨论】:

      【解决方案5】:

      一个简单的作弊方法是将字符串转换为字符数组,您可以使用 Int 对其进行索引:

      let a = Array("hello")
      for i in a.indices {
         print(a[i])
      }
      

      【讨论】: