swift2 如何将Int转换为String.CharacterView.Index

hi3rlvi2  于 2022-11-06  发布在  Swift
关注(0)|答案(5)|浏览(171)

我快疯了。
在Swift 2.2中,不可能将Int作为String的下标。例如:

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

这将导致编译错误,即
'subscript'无法使用:不能使用Int为String添加下标,请参阅文档注解以进行讨论
我看到的一个解决方法是将整数转换为索引类型,但我不知道如何...

lskq00tm

lskq00tm1#

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

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
oiopk7p5

oiopk7p52#

这并不是说订阅是不可能的,只是需要额外的一步来获得和以前一样的结果。下面,我做了和你一样的事情,但是在Swift 2.2

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

斯威夫特3.x + 4.x

let myString = "Test string"
let intForIndex = 0
let index = myString.index(myString.startIndex, offsetBy: intForIndex)
let firstCharacter = myString[index]
  • 编辑1:*

更新了代码,以便您可以在其他位置使用传递到“index”值的Int

  • 语法编辑:*

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

v6ylcynt

v6ylcynt3#

swift 4示例:

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

voj3qocg4#

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

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

643ylb085#

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"

相关问题