我怎样才能得到字符串的第n个字符?我尝试了括号([])访问器,没有运气。
var string = "Hello, world!"
var firstChar = string[0] // Throws error
错误:'下标'是不可用的:不能下标String与Int,请参阅文档注释讨论
我怎样才能得到字符串的第n个字符?我尝试了括号([])访问器,没有运气。
var string = "Hello, world!"
var firstChar = string[0] // Throws error
错误:'下标'是不可用的:不能下标String与Int,请参阅文档注释讨论
当前回答
这是最好最简单的方法之一
let yourString = "thisString"
print(Array(yourString)[8])
将字符串中的每个字母放入数组 然后选择第9个
其他回答
我刚想出了一个巧妙的变通办法
var firstChar = Array(string)[0]
Swift 2.0的Xcode 7通用种子
var text = "Hello, world!"
let firstChar = text[text.startIndex.advancedBy(0)] // "H"
对于第n个字符,将0替换为n-1。
编辑:Swift 3.0
text[text.index(text.startIndex, offsetBy: 0)]
注意,有更简单的方法来获取字符串中的某些字符
例如:let firstChar = text.characters.first
不使用整数进行索引,只使用String.Index。主要是线性复杂度。您还可以从String中创建范围。索引并使用它们获取子字符串。
斯威夫特3.0
let firstChar = someString[someString.startIndex]
let lastChar = someString[someString.index(before: someString.endIndex)]
let charAtIndex = someString[someString.index(someString.startIndex, offsetBy: 10)]
let range = someString.startIndex..<someString.index(someString.startIndex, offsetBy: 10)
let substring = someString[range]
快2.倍
let firstChar = someString[someString.startIndex]
let lastChar = someString[someString.endIndex.predecessor()]
let charAtIndex = someString[someString.startIndex.advanceBy(10)]
let range = someString.startIndex..<someString.startIndex.advanceBy(10)
let subtring = someString[range]
请注意,不能使用从一个字符串到另一个字符串创建的索引(或范围)
let index10 = someString.startIndex.advanceBy(10)
//will compile
//sometimes it will work but sometimes it will crash or result in undefined behaviour
let charFromAnotherString = anotherString[index10]
下标在这里很有用
但是字符串下标将把参数作为字符串。索引,所以很多人都搞不懂如何传递字符串。索引以获取如何形成字符串的详细信息。索引根据我们的要求,请参阅以下苹果文档
在这里,我创建了一个扩展方法来获取字符串中的第n个字符
extension String {
subscript(i: Int) -> String {
return i < count ? String(self[index(startIndex, offsetBy: i)]) : ""
}
}
使用
let name = "Narayana Rao"
print(name[11]) //o
print(name[1]) //a
print(name[0]) //N
print(name[30]) //""
如果你传递的索引超出了字符串计数的范围,它将返回空字符串
我认为获取第一个字符的快速答案可能是:
let firstCharacter = aString[aString.startIndex]
它的优雅和性能比:
let firstCharacter = Array(aString.characters).first
但. .如果你想操纵和做更多的操作与字符串,你可以考虑创建一个扩展..这是一个扩展与这种方法,它非常类似于已经在这里张贴:
extension String {
var length : Int {
return self.characters.count
}
subscript(integerIndex: Int) -> Character {
let index = startIndex.advancedBy(integerIndex)
return self[index]
}
subscript(integerRange: Range<Int>) -> String {
let start = startIndex.advancedBy(integerRange.startIndex)
let end = startIndex.advancedBy(integerRange.endIndex)
let range = start..<end
return self[range]
}
}
但这是个糟糕的主意!!
下面的扩展是非常低效的。每次使用整数访问字符串时,都会运行一个O(n)函数来提高其起始索引。在另一个线性循环中运行一个线性循环意味着这个for循环意外地是O(n2)——随着字符串长度的增加,这个循环所花费的时间呈二次方增加。
而不是这样做,你可以使用字符的字符串集合。