Fork me on GitHub

Swift 中如何正确的获取字符串的长度

BSText 开发过程中遇到的一个坑。emoji 输入的时候,会有问题,排查了好久发现是输入的字符长度获取错误导致字符串插入的位置错乱,那为什么获取 emoji 字符串的长度会出错呢?

原来在 Objc 中读取 NSString 长度使用的是 .length,length返回的是基于 UTF-16 的长度。而在 Swift 中读取 String 的长度,通常使用的是 count,而 count 本身返回的是 characters.count,只是 Unicode 字符个数。这两者的区别在纯文本中看不出来,但是包含 Emoji 的时候就十分明显了。

举个例子:“😆😆😆😆😆😆”,用 Objc 的 length 读取返回的是12,而用 Swift 的 count 读取返回的是6,这在做一些富文本插入操作时,得到的结果绝不会是你想要的。

不过不用担心,Swift 有专门的 utf16.count 来对应 NSString 的 .length,在使用的时候只需要 string.utf16.count就可以得到与 Objc 中 length 相同的结果。但是这么长显然太繁琐了是不是,用 extension 解决掉:

1
2
3
4
5
6
7
8
9
extension String {
var length: Int {
return self.utf16.count
}
}

// 使用
let emoji = “😆😆😆😆😆😆”
emoji.length // return 12

这样一来,在 Swift 的 String 中也可以保持和 Objc 中 NSString 相同的书写习惯了。

掘金沸点原文:https://juejin.im/pin/5cbe8d88f265da3d848d4908

 

Swift 中更好的方式判断空字符串

一般情况下,我们判断一个字符串是否为空,会使用 str.count == 0,来得出结果。不过这里有一个小细节,其实使用 str == “” 来判断,理论上会更合理合理一些。

这是因为 str == “” 的时间复杂度为O(1),str.count > 0 的时间复杂度为 O(n)。

------------- 本文结束感谢您的阅读 -------------