内容简介:我们仍然在谈论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弦乐和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 } 复制代码
我们可以运行应用程序并检查正确的文本是否显示为选择。同样,使用正确的范围转换初始化器很重要,因为否则我们会遇到与以前相同的问题,但这次是在另一个方向:从。 NSRange
到 Range
。
比较字符数
既然我们有正确的字符串,我们可以使用有关选择的信息填充其他标签:
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字符串的其他视图也是如此:
如果我们选择:woman|type_1_2::fire_engine:表情符号,事情会变得更加复杂。正如预期的那样,Swift字符串是一个字符长。NSString表示它的长度为7 - 这与Swift字符串 utf16
视图的长度匹配,因为NSStrings由UTF-16支持:
Swift字符串的 unicodeScalars
视图返回四个计数。您可以在线查看Unicode字符的元素。在这种情况下,消防员表情符号字符由“女人”,肤色修饰符,零宽度木匠和“消防引擎”组成 - 总共有四个标量。
法国国旗表情符号:fr:被列为一个Swift字符串字符,四个NSString字符和两个Unicode标量(特殊标志版本的“F”和“R”)。考虑所有这些不同的计数,混合范围和指数是行不通的。如果你只处理简单的字母字符,你可以使用 Range
和 NSRange
互换。但是只要你遇到一个更复杂的角色,比如表情符号,以下索引在各种字符串视图中都会有所不同。
家庭角色也很有趣。我们使用的表情符号:man::woman::girl:由三个标尺组成,用于个人,另外还有两个零宽度连接器将它们组合成一个系列:总共五个标量。
结论
在对字符串的原始数据进行操作时,我们必须要小心,因为我们可能会更改单个系列成员的字节并无意中更改整个系列字符。对整个字符进行操作比对单个字节或标量进行操作更安全。幸运的是,我们今天看到的两个初始化器,转换 Range
为 NSRange
和返回,使事情变得更容易。
以上所述就是小编给大家介绍的《如何在混合的Swift String / NSString环境中使用范围》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 保持安全控制范围成功保护混合云
- 使用golang写一个高性能端口扫描器,支持IP范围,端口号范围
- jQuery日期范围选择器
- ThinkPHP模板范围判断标签使用
- JavaScript生成指定范围的时间列表
- [译] Ruby 2.6 增加无穷范围
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
区块链技术驱动金融
阿尔文德·纳拉亚南、约什·贝努、爱德华·费尔顿、安德鲁·米勒、史蒂文·戈德费德 / 林华、王勇 / 中信出版社,中信出版集团 / 2016-8-25 / CNY 79.00
从数字货币及智能合约技术层面,解读了区块链技术在金融领域的运用。“如果你正在寻找一本在技术层面解释比特币是如何运作的,并且你有一定计算机科学和编程的基本知识,这本书应该很适合你。” 《区块链:技术驱动金融》回答了一系列关于比特币如何运用区块链技术运作的问题,并且着重讲述了各种技术功能,以及未来会形成的网络。比特币是如何运作的?它因何而与众不同?你的比特币安全吗?比特币用户如何匿名?区块链如何......一起来看看 《区块链技术驱动金融》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
Base64 编码/解码
Base64 编码/解码