String的长度作为String的扩展名

Chr*_*ley 2 xcode count ios swift

我知道会有很多指向重复的指针但是在我更新到xcode 6.3之前这已经有效了,现在它有问题.

剧本:

extension String {

    func removeCharsFromEnd(count:Int) -> String {
        var getSelf = self as String
        var stringLength = count(getSelf.utf16)

        let substringIndex = (stringLength < count) ? 0 : stringLength - count

        return self.substringToIndex(advance(self.startIndex, substringIndex))
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:无法使用类型为'(String.UTF16View)的列表的参数调用'count'


我还想指出,这种新的计数方法适用于我用过的其他地方(在此扩展之外).

提前致谢.

Mar*_*n R 5

count是扩展方法参数的名称,并隐藏Swift库函数count().您可以重命名参数或调用

var stringLength = Swift.count(getSelf.utf16)
Run Code Online (Sandbox Code Playgroud)

明确.

但请注意,计算UTF-16代码单元的数量在这里是错误的,它应该是

var stringLength = Swift.count(getSelf)
Run Code Online (Sandbox Code Playgroud)

计算字符串中的字符数,因为这 advance()也是重要的.您可以轻松验证

let foo = "".removeCharsFromEnd(1)
println(foo)
Run Code Online (Sandbox Code Playgroud)

以下是您的方法的简化版本:

extension String {

    func removeCharsFromEnd(count : Int) -> String {
        precondition(count >= 0, "Attempt to call removeCharsFromEnd() with a negative count")
        // Decrement `endIndex` by `count`, but not beyond `startIndex`:
        let idx = advance(self.endIndex, -count, self.startIndex)
        return self.substringToIndex(idx)
    }
}
Run Code Online (Sandbox Code Playgroud)

使用advance()具有负距离的三参数版本.

Swift 2/Xcode 7的更新:

extension String {

    func removeCharsFromEnd(count : Int) -> String {
        precondition(count >= 0, "Attempt to call removeCharsFromEnd() with a negative count")
        // Decrement `endIndex` by `count`, but not beyond `startIndex`:
        let idx = self.endIndex.advancedBy(-count, limit: self.startIndex)
        return self.substringToIndex(idx)
    }
}
Run Code Online (Sandbox Code Playgroud)