Swift 中使用字符串 length 时的注意事项

Mar 07, 2024 • 预计阅读时间 1 分钟

NSString 中,有一个length 属性,在 NSMutableAttributedString 设置属性的时候, range 指定的 length 需要和 NSStringlength 一致,否则就会出现越界错误而导致崩溃。

在 Swift 中使用的是 String 而不是 NSString ,而且 String 是全新设计的类型,虽然可以和 NSString 桥接互相使用,但是 Stringcount 属性却和 NSStringlength 完全不同,如果在 Swift 里面操作 NSAttributedString 的时候,对于 rangelength 设置,使用的是 count ,就会造成错误。

正确的做法有两种:

方法一,桥接到 NSString 使用 length 属性:

let string = "OK👌"
let range = NSRange(location: 0, length: (string as NSString).length)

方法二,按 Swift 官方文档的建议,NSString 是以 UTF-16 编码存储字符串的,所应该传 UTF-16 编码的 count 作为 length

let string = "OK👌"
let range = NSRange(location: 0, length: string.utf16.count)

Strings and Characters

Note Swift’s String type is bridged with Foundation’s NSString class. Foundation also extends String to expose methods defined by NSString. This means, if you import Foundation, you can access those NSString methods on String without casting. For more information about using String with Foundation and Cocoa, see Bridging Between String and NSString.

Swift
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

解决安装 Xcode 后仍然需要依赖 CommandLineTools 的问题

解决 Xcode 智能提示失效的问题