我想找到第一个出现在给定索引处的字符串。
基于this answer我创建了以下功能:
func index(of string: String, from startIndex: String.Index? = nil, options: String.CompareOptions = .literal) -> String.Index? {
if let startIndex = startIndex {
return range(of: string, options: options, range: startIndex ..< string.endIndex, locale: nil)?.lowerBound
} else {
return range(of: string, options: options, range: nil, locale: nil)?.lowerBound
}
}
不幸的是,带索引的部分不起作用。
例如,以下代码返回nil
而不是3
:
let str = "test"
str.index(of: "t", from: str.index(str.startIndex, offsetBy: 1))
答案 0 :(得分:2)
您将搜索限制在错误的范围内。 string.endIndex
应为self.endIndex
(或仅endIndex
)。
进一步评论:
range: nil
和locale: nil
可以省略,因为那些
参数有默认值。
String.Index
可缩短为Index
内的String
扩展方法,类似于String.CompareOptions
。
我不会因此而调用可选参数startIndex
与startIndex
的{{1}}属性混淆。
全部放在一起:
String
或者
extension String {
func index(of string: String, from startPos: Index? = nil, options: CompareOptions = .literal) -> Index? {
if let startPos = startPos {
return range(of: string, options: options, range: startPos ..< endIndex)?.lowerBound
} else {
return range(of: string, options: options)?.lowerBound
}
}
}