Swift中的字符串
2019-10-08 本文已影响0人
下班不写程序
- OC中使用NSString定义字符串 -> 是一个 对象.
- Swift中用String定义字符串 -> 是一个 结构体.
- String比NSString更加轻量级,效率更高.
- String 支持直接遍历
1. Swift中的for循环
仿照OC的写法已经废弃(3.0), 在Swift中使用for-in.
/* for -in 循环分为两种, 是否关心下标
判断区间解释:
0..<5 代表 [0, 5) 左闭右开, 大于等于0, 小于5
0...5 代表 [0, 5] 左闭右闭, 大于等于0, 小于等于5
*/
func demo(){
// 1. 关心下标
for i in 0..<5 {
print(i)
}
// 2. 不管心下标 - 使用占位符
for _ in 0..<5 {
print("不关系下标")
}
}
2. 字符串的遍历和字节长度的计算
func demo(){
// 1. 定义一个字符串
let str = "不想睡,我要陪你一整夜"
// 2. 打印字符串 -- 结果:不想睡, 我要陪你一整夜
print(str)
// 3. 遍历
// 3.1 将字符串 -> 字符, 然后进行遍历
for c in str.characters {
/*
报警告: 'characters' is deprecated: Please use String or Substring directly
释 义: characters已过期, 请直接使用字符串或者子字符串
characters :n. 人物, 特征;[计]字符
*/
print(c)
}
// 3.2 Swift中字符串s本质是结构体 - 支持直接遍历
for c in str{
print(c)
}
/* 两种便利的结果都为:
不
想
睡
,
我
要
陪
你
一
整
夜
*/
// 4. 打印字符串的长度 -- 结果:11
print(str.count)
// 5. 指定编码下的字节长度 汉字 utf-8 是 3 个字节 -- 结果: 31
let len = str.lengthOfBytes(using: String.Encoding.utf8)
print(len)
// 或者直接打印
print(str.utf8.count)
}
3.字符串的合并
Swift中 使用”\ ( 常量名或者变量名 )” 完成字符串的快速转换
func demo(){
// 字符串合并方式一
let name = "老王"
let age = 18
let result = "我叫" + name + "年龄" + "\(age)"
print(result)
// 字符串合并方式二
let result2 = "我叫\(name)年龄\(age)"
print(result2)
// 输出时间为例, 练习字符串拼接
// 输出格式: 09:14:34(时间, 不足两位,前一位以0补足)
let h = 9
let m = 14
let s = 34
/* 方式一
String(format: <#T##String#>, arguments: <#T##[CVarArg]#>)
参数一: 格式
参数二: 数组
*/
let timeResult = String(format: "%02d:%02d:%02d", arguments: [h, m, s])
print(timeResult)
/* 方式二
String(format: <#T##String#>, <#T##arguments: CVarArg...##CVarArg#>)
参数一: 格式
参数二: 可变参数
*/
let timeResult2 = String(format: "%02d:%02d:%02d", h, m, s)
print(timeResult2)
}
4.字符串的截取
func demo(){
// 定义字符串
let str = "不想睡,我要陪你一整夜"
// 1. 从头开始截取
// 1.1 .substring方式, 在3.0废弃了, 并且与to的 哈哈哈 没关系, 只是单纯的计算个数
let newStr1 = str.substring(to: "哈哈哈".endIndex)
print(newStr1) // 结果:不想睡
// 1.2 .prefix方式
let newStr2 = str.prefix(4)
print(newStr2) // 结果:不想睡,
// 1.3 String方法 -- 注意: []里面的截取范围, 不能是证书, 必须是String.Index区间类型
let newStr3 = String(str[..."哈哈哈".endIndex])
print(newStr3) // 结果:不想睡,
// 2. 从结尾往前截取
// 2.1 .substring方式, 在3.0废弃了
let newStr4 = str.substring(from: "哈哈哈".endIndex)
print(newStr4) // 结果:,我要陪你一整夜
// 2.2 .suffix方式 传入截取的位数, 直接倒数截取
let newStr5 = str.suffix(3)
print(newStr5) // 结果:一整夜
// 2.3 .suffix方式 从什么位置开始截取 注意: 任何str.startIndex都是0!!!
let newStr6 = str.suffix(from: "哈哈哈".endIndex)
print(newStr6) // 结果:,我要陪你一整夜
// 3. 从中间截取 [3~6]
// 3.1
let startIndex = "哈哈哈".endIndex
let endIndex = "哈哈哈呵呵呵".endIndex
let result = String(str[startIndex...endIndex])
print(result) // 结果:,我要陪
// 3.2 offsetBy : 正数,从左往右数; 反之,从右往左
let startIndex2 = str.index(str.startIndex, offsetBy: 3)
let endIndex2 = str.index(str.startIndex, offsetBy: 6)
let result2 = String(str[startIndex2...endIndex2])
print(result2) // 结果:,我要陪
/* 3.3 after: 之后/before: 之前
所以after要少一位, before要多一位
*/
let startIndex3 = str.index(after: "哈哈".endIndex)
let endIndex3 = str.index(before: "哈哈哈呵呵呵呵".endIndex)
let result3 = String(str[startIndex3...endIndex3])
print(result3) // 结果:,我要陪
}
注意: 其实String和NSString可以无缝转换, 当讨厌的时候,可以转换成NSString, 再进行NSString操作, 还有就是一些NSString中的一些方法, 是String中没有的, 所以当需要的时候, 应该适应的进行转换.
func demo(){
// 定义字符串
let str = "不想睡,我要陪你一整夜"
// 转至 OC 字符串进行后续操作 : 通过 as 转换类型, 后续会详细说明.
let ocString = (str as NSString).substring(with: NSMakeRange(3, 4))
print(ocString) // 结果:,我要陪
}
最后, 以上内容如有问题, 欢迎指正, 或者有其他的问题, 也欢迎留言讨论~