我试图实现一个方法lastindexof。我的代码
extension String {
var length:Int {
return self.characters.count
}
func indexOf(target: String) -> Int? {
let range = (self as NSString).rangeOfString(target)
guard range.toRange() != nil else {
return nil
}
return range.location
}
func lastIndexOf(target: String) -> Int? {
let range = (self as NSString).rangeOfString(target, options: NSStringCompareOptions.BackwardsSearch)
guard range.toRange() != nil else {
return nil
}
return self.length - range.location - 1
}
}
indexof返回我45
“11055010155031E146145257690278F95004ECA3D9EA110038DA71507”,索引(“1003”)
但最后一次是11
“11055010155031E146145257690278F95004ECA3D9EA110038DA71507”,LastIndexof(“1003”)
我不知道我的错误在哪里
谢谢你的帮助
最佳答案
方法返回11,因为
return self.length - range.location - 1
从找到子字符串的位置计算偏移量
到字符串的最后一个字符,在您的情况下是
lastIndexOf()
。如果将返回语句更改为
return range.location
然后两个调用都会得到
57 - 45 - 1 = 11
,因为子字符串“1003”在较大的字符串中只发生一次。
请注意,您可以在不使用
45
/NSString
的情况下计算偏移:extension String {
func indexOf(target: String) -> Int? {
if let range = self.rangeOfString(target) {
return startIndex.distanceTo(range.startIndex)
} else {
return nil
}
}
func lastIndexOf(target: String) -> Int? {
if let range = self.rangeOfString(target, options: .BackwardsSearch) {
return startIndex.distanceTo(range.startIndex)
} else {
return nil
}
}
}
对于字符不在
“基本的多语言平面”,如emojis或“flags”。例如
"abc😀def".indexOf("d")
方法返回
NSRange
而不是5
或"abc🇩🇪def".indexOf("d")
方法返回
4
而不是7
。SWIFT 3的更新:
extension String {
func index(of target: String) -> Int? {
if let range = self.range(of: target) {
return characters.distance(from: startIndex, to: range.lowerBound)
} else {
return nil
}
}
func lastIndex(of target: String) -> Int? {
if let range = self.range(of: target, options: .backwards) {
return characters.distance(from: startIndex, to: range.lowerBound)
} else {
return nil
}
}
}