介绍
在 Swift
中绝大多数情况下都推荐使用 String
类型,在 Swift3.0
更是取消了 NSString
在 Swift
文件中的代码提示。
特点
-
String
是一个结构体,性能比NSString
更高; -
String
拥有绝大部分NSString
的功能; -
String
可以直接进行遍历,NSString
不支持直接遍历。
字符串的遍历
override func viewDidLoad() {
super.viewDidLoad()
demo()
}
func demo() {
let str = "这是一段测试字符"
for c in str.characters {
print(c)
}
}
输出结果:
获取字符串的长度
- 获取字符串的字节长度
用习惯了override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let str = "这是一段测试字符" print(str.lengthOfBytes(using: .utf8)) }
Objective-C
里的length
方法初转到Swift
会很不习惯。以上代码的意思是通过lengthOfBytes()
函数获取字符串在内存中的字节数,.utf8
是指定字符串的编码格式。以下为输出结果:
utf8
编码格式下每个汉字占用三个字节,所以会输出为24。 - 获取字符串字符数的两种方式
1.Swift
获取字符串字符数(推荐使用);override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let str = "这是一段测试字符" print(str.characters.count) }
- 使用
NSString
中转获取字符串的字符数。
上面代码中的override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let str = "这是一段测试字符" let ocStr = str as NSString print(ocStr.length) }
as
表示将前面str
做为NSString
,类似于Objective-C
中的类型强转(NSString *)str
,以下为代码输出结果:
- 使用
字符串的拼接
- 代码示例
以上代码是在override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let name = "张三" let age = 25 let title : String? = "总裁" print("姓名:\(name)\n年龄:\(age)\n职位:\(title ?? "")") }
Swift
中常规的字符串拼接方式,格式为:"\(var或者let)
再也不需要考虑类似于stringWithFormat
这样的语句了。值得注意的是可选项拼接的时候需要解包。
代码的输出结果:
限定格式的字符串拼接
- 代码示例
以上代码将数值以时间格式输出,类似于override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let h = 5 let m = 7 let s = 6 print(String(format:"%02d:%02d:%02d", h, m, s)) }
Objective-C
中的格式化字符串语句[NSString stringWithFormat:]
代码输出结果:
字符串的子串(截取)
在2.0和3.0时代,Swift
有自己截取子字符串的方法,但一直在优化,在4.0更新了以后更是放弃了 Swift
相对繁琐的截取方法,所以在 Swift4.0
时代我们只有通过将 String
字符串转成 NSString
来进行操作
- 代码示例:
上面代码表示定义了一个常量字符串override func viewDidLoad() { super.viewDidLoad() demo() } func demo() { let str = "abcdefg" let ocStr = str as NSString let s1 = ocStr.subString(with: NSMakeRange(2, 3)) print(s1) }
“abcdefg”
并将这个字符串强转为NSString
,接下来的操作就和我们用Objective-C
的操作一样了,NSMakeRange(2, 3)
表示从第二个字符开始截取三个长度的子字符串。
输出结果:
Swift3.0
的截取方法(已过期但仍可以使用),具体实现方法就不一一做介绍了,有时间会写一篇关于Swift
字符串操作的专题。
总结
-
Swift
中的字符串String
是一个结构体; -
String
比NSString
更加强大,支持直接遍历; -
String
比NSString
性能更高; -
String
不能直接使用length
获取字符长度,通过lengthOfBytes()
获取到的长度是字符串的所占字节数,如果要用Objective-C
的方法操作String
需要类型强转,写法为String as NSString
; -
String
的拼接比NSString
更加简便好用,如果拼接复杂型字符串也有相应的函数; -
String
的截取推荐转换为NSString
来操作,因为Swift4.0
取消了字符串截取方法,使用NSString
更容易理解。