我试图实现一个方法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
        }
    }
}

10-08 08:06