登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

如何在混合的Swift String / NSString环境中使用范围 [复制链接]

2019-6-13 13:04
MayJuin 阅读:43 评论:0 赞:0
Tag:  iOSswift

我们仍然在谈论Swift字符串的主题,今天我们将会看到你在使用String和处理时遇到的问题NSString。如果您使用来自AppKit和Foundation的文本API,则必须处理这两种字符串类型,并且需要注意一些棘手的差异。

我们将使用一个小示例应用程序来播放字符串中的字符串和范围。我们要看的第一件事是Swift字符串和NSStrings的范围之间的差异。

将范围转换为NSRange

当我们输入搜索字段时,我们想在文本视图中突出显示找到的单词。视图控制器已经有一个方法,search我们可以在其中使用text为搜索字段的文本提供的属性String

func search(_ searchTerm: String) {
   guard let range = text.range(of: searchTerm) else { return }

}

在Swift字符串中找到范围后,我们希望使用方法showFindIndicator(for charRange: NSRange)on 在文本视图中突出显示此范围NSTextView。不幸的是,我们不能直接将我们传递Range给这个方法 - 我们应该先用新的NSRange初始化器转换它:

func search(_ searchTerm: String) {
    guard let range = text.range(of: searchTerm) else { return }
    let nsRange = NSRange(range, in: text)
    textView.showFindIndicator(for: nsRange)
}

我们运行应用程序并看到它的工作原理:在搜索字段中输入“Hello”后,文本视图中的“Hello”字样闪烁。如果输入“World”,它也会这样做。

这是一个简单的解决方案,但如果您不使用正确的NSRange初始化程序,则很容易出错。我们在Stack Overflow上看到了很多代码,在其他地方人们手动计算索引来构造NSRange

func search(_ searchTerm: String) {
    guard let range = text.range(of: searchTerm) else { return }
    let location = text.distance(from: text.startIndex, to: range.lowerBound)
    let length = text.distance(from: range.lowerBound, to: range.upperBound)
    let nsRange = NSRange(location: location, length: length)
    textView.showFindIndicator(for: nsRange)
}

04:09这段代码编译,但是错了。我们一开始可能不会注意到,因为如果我们搜索“你好”,正确的单词会闪烁,但如果我们搜索“世界”,第一个表情符号会突出显示!

 Swift弦乐和NSStrings对角色的概念有不同的概念; 我们不能通过简单地计算索引Range来转换为a NSRange,因为它们具有不同的索引类型。具有肤色修饰符的女性消防员表情符号可能看起来像单个字符,但它不适用于NSString。

我们恢复正确的代码并继续我们的应用程序的第二个功能。

将NSRange转换为Range

当我们选择文本的一部分时,我们希望在右侧的信息面板中显示有关该选择的一些信息。这次,我们必须将NSRange文本视图转换为a Range,以便从Swift字符串中获取子字符串text并将其传递给名为的标签selection

func updateInfo() {
    let nsRange = textView.selectedRange()
    let range = Range(nsRange, in: text)!
    let value = String(text[range])
    selection.stringValue = value
}

我们可以运行应用程序并检查正确的文本是否显示为选择。同样,使用正确的范围转换初始化器很重要,因为否则我们会遇到与以前相同的问题,但这次是在另一个方向:从。NSRangeRange

比较字符数

既然我们有正确的字符串,我们可以使用有关选择的信息填充其他标签:

func updateInfo() {
    let nsRange = textView.selectedRange()
    let range = Range(nsRange, in: text)!
    let value = String(text[range])
    selection.stringValue = value
    characterCount.stringValue = String(value.count)
    nsStringCount.stringValue = String((value as NSString).length)
    utf16Count.stringValue = String(value.utf16.count)
    unicodeScalarCount.stringValue = String(value.unicodeScalars.count)
    byteCount.stringValue = String(value.data(using: .utf8)!.count)
}

这会产生一些有趣的信息。如果我们再次选择“Hello”,则信息看起来很简单,因为Swift字符串和NSString都是五个字符长,Swift字符串的其他视图也是如此:

如果我们选择

分享到:
我来说两句
facelist
您需要登录后才可以评论 登录 | 立即注册
所有评论(0)
关闭

每日头条

通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

返回顶部