gpt4 book ai didi

swift - 如何使用 swift 2.0 获取 lastIndexof

转载 作者:搜寻专家 更新时间:2023-11-01 05:45:55 25 4
gpt4 key购买 nike

我试图实现一个方法 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".indexOf("1003")

但是 lastIndexOf 11

"11055010155031e146145257690278f95004eca3d9ea110038da71507".lastIndexOf("1003")

我不确定我的错误在哪里

感谢您的帮助

最佳答案

您的 lastIndexOf() 方法返回 11,因为

return self.length - range.location - 1

计算从找到子字符串的位置的偏移量到字符串的最后一个字符,在您的例子中是 57 - 45 - 1 = 11。如果将返回语句更改为

return range.location

然后你会得到 45 因为子串“1003”在较大的字符串中只出现一次。

请注意,您可以在不使用 NSString/NSRange 的情况下计算偏移量:

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
}
}
}

这对于字符在“基本多语言平面”,如表情符号或“旗帜”。例子是

"abc😀def".indexOf("d")

您的方法返回 5 而不是 4

"abc🇩🇪def".indexOf("d")

您的方法返回 7 而不是 4


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
}
}
}

关于swift - 如何使用 swift 2.0 获取 lastIndexof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32812268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com