如何在文本视图中的某个索引处获取字符的行号和列号?

Dej*_*dar 5 macos nstextview swift

我有一个NSTextView里面有很多文字。

如何在某个索引处获取字符的行号和列号?

让我们说,我有这段文字NSTextView

"This is just a\ndummy text\nto show you\nwhat I mean."
Run Code Online (Sandbox Code Playgroud)

我需要第 16 个字符的行号和列号。在这种情况下:

Line: 2
Column: 2
Run Code Online (Sandbox Code Playgroud)

我如何使用 Swift 计算/获得它?

另一个例子:

"This is just a\ndummy text\nto show you\nwhat I mean."
Run Code Online (Sandbox Code Playgroud)

我想要第15 个(或第 16 个,如果\n也计算在内)字符的行号和行号,如下所示:

Line: 2
Column: 1
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 6

您只需要使用 String 方法 componentsSeparatedByString 中断文本行,然后您只需要按如下方式计算行、列和字符位置:

extension String {
    func characterRowAndLineAt(position: Int) -> (character: String, line: Int, column:Int)? {
        var lineNumber = 0
        var characterPosition = 0
        for line in components(separatedBy: .newlines) {
            lineNumber += 1
            var columnNumber = 0
            for column in line {
                characterPosition += 1
                columnNumber += 1
                if characterPosition == position {
                    return (String(column), lineNumber, columnNumber )
                }
            }
            characterPosition += 1
            if characterPosition == position {
                return ("\n", lineNumber, columnNumber+1 )
            }
        }
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)
let myText    = "This is just a\ndummy text\nto show you\nwhat I mean."
let result    = myText.characterRowAndLineAt(position: 16) // "(.0 "d", .1 2, .2 1)"
let character = result?.character  // "d"
let line      = result?.line       // 2
let column    = result?.column     // 1
Run Code Online (Sandbox Code Playgroud)

  • 如果有更简单/更快的方法,请发布您的解决方案 (3认同)