字符串的定义
- 字符串是一系列的字符 比如"hello" 。Swift有String来表示字符串,String类型可以通过各种方式来访问字符串,包括作为Character的集合
- Swift 的 String和 Character 类型提供了一种快速的符合 Unicode 的方式操作,每一个字符串都是由 Unicode 字符的独立编码组成
字符串字面量
- 被双引号( ")包裹的固定顺序文本字符,用字符串字面量作为常量或者变量的初始值
【注意】
- 多行字符串字面量里包含了换行,那个换行符(\n)同样会成为字符串里的值,如果不需要换行符在末尾添加(\)
var string = """
abcdefg\
hijklmn
"""
print(string)//输出:abcdefghijklmn 无换行
- 多行字符串可以缩进以匹配周围的代码
func function() ->String{
let string = """
abcdefg
hijklmn
opqrst
uvw
xyz
"""
return string
}
print(function())
/*
输出结果:
abcdefg
hijklmn
opqrst
uvw
xyz
*/
字符串中的特殊字符
- 转义字符 \0 (空字符) \ (反斜杠) \t (水平制表符)\n (换行符) \r(回车符) "(双引号) '(单引号)
- 任意的Unicode标量 \u{n},n是一个1-8位合法的Unico的码位相等的16进制数字
let sparklingHeart = "\u{1F496}"//💖
【注意】如果需要某些转义字符不生效,需要怎么办呢?
- 扩展字符分隔符
- 在字符串字面量中放置扩展分隔符来在字符串中包含特殊字符而不允许生效。将字符串放在双引号( " )内并由#号( # )包裹
- 如需要字符串中某个特殊符号生效,使用匹配你包裹的#号数量的#号并在前面写转义符号 \ (数量不同无效当普通字符处理)
let str1 = "Line1\nLine2\nLine3"
let str2 = #"Line1\#nLine2\nLine3"#
let str3 = ##"Line1\#nLine2\##nLine3"##
print(str1,str2,str3,separator: "\n\n", terminator: "\n")
/*输出结果:
Line1
Line2
Line3
Line1
Line2\nLine3
Line1\#nLine2
Line3
*/
字符串相关用法(常用方法)
字符串初始化
- ** String.init()**方法
- 赋值字面量
var str1 = String.init()
var str2 = String.init("hello,world")
var str6 = String.init("Hello".utf8)
var str3 = String.init(repeating: "hello", count: 3)
var str4 = String()
var str5 = ""
String的增删改查
- 查询(查找指定下标 判断是否有值)
var str1 = String.init("hello,world")
print(str1[str1.startIndex])//输出:h
//print(str1[str1.endIndex])//错误:越界
print(str1[str1.index(before: str1.endIndex)])//输出:d
print(str1[str1.index(after: str1.startIndex)])//输出:e
var index:String.Index? = str1.firstIndex(of: "o")//返回可选类型 不确定是否能查到
if let index3 = index {
let index2 = str1.index(index3, offsetBy: 3)
print(str1[index3],str1[index2])//输出:o o
}else{
print("没有找到")
}
print("\(str1.isEmpty)")//输出:false
print("\(str1.count)")//输出:11
- 增加、替换、插入指定范围
- 字符串的特定索引位置插入字符,使用 insert(_:at:)方法
- 插入另一个字符串的内容到特定的索引,使用 insert(contentsOf:at:) 方法。
- 字符串插值:是一种从混合常量、变量、字面量和表达式的字符串字面量构造新的String值
//增加字符串
var str1 = String.init("World!")
str1.append("China!")
str1.append(contentsOf: "Wuhan!")
str1 = str1 + "Hongshan!"
print(str1)//输出:World!China!Wuhan!Hongshan!
//插入字符串
var index :String.Index? = str1.firstIndex(of: "H")
str1.insert("😬", at: index!)
str1.insert("😬", at: str1.endIndex)
str1.insert(contentsOf: "HaHa", at: str1.endIndex)
str1.insert(contentsOf: "Hi!", at: str1.index(before: str1.endIndex))
print(str1)//输出:World!China!Wuhan!😬Hongshan!😬HaHHi!a
//区间替换
var str2 = String.init("Wuhan")
var index2 :String.Index? = str2.firstIndex(of: "u")
var index3 :String.Index? = str2.index(before: str2.endIndex)
let replaceSpace = index2!...index3!
str2.replaceSubrange(replaceSpace, with: "德玛西亚")
print(str2)//输出:W德玛西亚
//字符串插值
let value1 = 10,value2 = 20
var str3 = "\(value1)\(value2)"//1020
- 删除字符串
var str1 = "abcdefghijklmn"
var index :String.Index = str1.index(before: str1.endIndex)
str1.remove(at: index)//返回值:n 删除成功 str1值: abcdefghijklm
str1.removeFirst()//返回值:a str1值: bcdefghijklm
str1.removeLast() //返回值:m str1值: bcdefghijkl
var index2 :String.Index? = str1.firstIndex(of: "d")
str1.removeSubrange(..<index2!)//str1值: defghijkl
let range = str1.index(str1.endIndex, offsetBy: -6)..<str1.endIndex
str1.removeSubrange(range)//str1值: def
str1.removeAll(keepingCapacity: true)//清空 但不释放已分配的空间
str1.removeAll()//清空 默认为false
//删除遍历筛选
var str1 = "asdcbbnn"
str1.removeAll { (char) -> Bool in
if char > "h"{
return true
}else{
return false
}
}
print(str1)//输出:adcbb
var str2 = "adcbe7777fg"
str2.removeAll { $0 == "7" }//上面遍历的简写
print(str2)//输出:adcbefg
- 更改字符串大小写
str1.uppercased()//ABCDEFGHIJKLMN
str1.lowercased()//abcdefghijklmn
- 字符串的比较 、遍历
- 字符串相等 ==
- 前缀相同 hasPrefix()
- 后缀相同 hasSuffix()
var str1 = "abCdefghijklmn"
var str2 = "aBcdefghijklmn"
var hasPref :Bool = str1.hasPrefix("abC")//true
var hasSuff :Bool = str2.hasSuffix("lmn")//true
var isEqual :Bool = str1 == str2 //false
for charatar in str1 {
print(charatar)
}
//使用indices属性访问字符串
for index in str1.indices {
print(str1[index])
}
String的其他用法
- 字符、字符串也能使用区间运算符 但默认不能用在for-in遍历中
let strRange:ClosedRange<String> = "cc"..."ff"
//如果不声明range类型 默认为String
strRange.contains("cb")//输出:false
strRange.contains("cz")//输出:true
strRange.contains("fg")//输出:false
let charRange :Range<Character> = "b"..<"f"
charRange.contains("a")//输出:false
charRange.contains("d")//输出:true
charRange.contains("f")//输出:false
- SubString(具体见第二十章 字符串要点)
- 使用下标或者类似 prefix(_:) 的方法,结果是一个 Substring 的实例,不是另一个字符串
- 可以操作字符串相同的方法来操作子字符串。
- 与字符串不同,在字符串上执行动作的话你应该使用子字符串执行短期处理。当你想要把结果保存得长久一点时,你需要把子字符串转换为 String 实例
- String和 Substring 都遵循 StringProtocol协议,能很方便地兼容所有接受 StringProtocol值的字符串操作函数
网友评论