如何在混合的Swift String / NSString环境中使用范围

栏目: Swift · 发布时间: 6年前

内容简介:我们仍然在谈论Swift字符串的主题,今天我们将会看到你在使用我们将使用一个小示例应用程序来播放字符串中的字符串和范围。我们要看的第一件事是Swift字符串和NSStrings的范围之间的差异。当我们输入搜索字段时,我们想在文本视图中突出显示找到的单词。视图控制器已经有一个方法,

我们仍然在谈论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 String / NSString环境中使用范围

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字符串的其他视图也是如此:

如何在混合的Swift String / NSString环境中使用范围

如果我们选择:woman|type_1_2::fire_engine:表情符号,事情会变得更加复杂。正如预期的那样,Swift字符串是一个字符长。NSString表示它的长度为7 - 这与Swift字符串 utf16 视图的长度匹配,因为NSStrings由UTF-16支持:

如何在混合的Swift String / NSString环境中使用范围

Swift字符串的 unicodeScalars 视图返回四个计数。您可以在线查看Unicode字符的元素。在这种情况下,消防员表情符号字符由“女人”,肤色修饰符,零宽度木匠和“消防引擎”组成 - 总共有四个标量。

法国国旗表情符号:fr:被列为一个Swift字符串字符,四个NSString字符和两个Unicode标量(特殊标志版本的“F”和“R”)。考虑所有这些不同的计数,混合范围和指数是行不通的。如果你只处理简单的字母字符,你可以使用 RangeNSRange 互换。但是只要你遇到一个更复杂的角色,比如表情符号,以下索引在各种字符串视图中都会有所不同。

家庭角色也很有趣。我们使用的表情符号:man::woman::girl:由三个标尺组成,用于个人,另外还有两个零宽度连接器将它们组合成一个系列:总共五个标量。

结论

在对字符串的原始数据进行操作时,我们必须要小心,因为我们可能会更改单个系列成员的字节并无意中更改整个系列字符。对整个字符进行操作比对单个字节或标量进行操作更安全。幸运的是,我们今天看到的两个初始化器,转换 RangeNSRange 和返回,使事情变得更容易。


以上所述就是小编给大家介绍的《如何在混合的Swift String / NSString环境中使用范围》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Creative Curve

The Creative Curve

Allen Gannett / Knopf Doubleday Publishing Group / 2018-6-12

Big data entrepreneur Allen Gannett overturns the mythology around creative genius, and reveals the science and secrets behind achieving breakout commercial success in any field. We have been s......一起来看看 《The Creative Curve》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具