SwiftUI 问答之如何将 Swift 范围range转换为使用 String.Index

实战问题

我正在开发一个 SwiftUI 应用程序,我想在文本视图中选择文本并在选择的开头插入一些文本。SwiftUI 的本机文本编辑器目前不支持获取选择范围,因此我必须包装 AppKit 文本视图并在选择更改时存储选择范围。

func textViewDidChangeSelection(_ notification: Notification) {
    guard let textView = notification.object as? 
        NSTextView else {

        return
    }
    control.model.selectionRange = 
        Range.init(textView.selectedRange())
}

上一个示例中的代码为我提供了一个 Swift 范围,它使用整数Range. 我想使用选择范围的开始索引作为插入字符串的目的地。

model.text.insert(contentsOf: textToInsert, 
    at: model.selectionRange?.startIndex)

但是编译器给了我一个错误。错误的原因是String结构的insert方法采用使用字符串索引的范围Range,而不是整数。

解决方案

解决方案是为字符串创建一个字符串索引并将其用作insert方法的参数。字符串索引的基础是字符串的起始索引。字符串索引的偏移量是选择范围的下限。

let insertionPoint = model.text.index(model.text.startIndex, 
    offsetBy: model.selectionRange?.lowerBound ?? 0)
model.text.insert(contentsOf: textToInsert, at: insertionPoint)

精品教程推荐


加入我们一起学习SwiftUI

QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com

发表回复