这是我参与更文挑战的第3天,活动详情查看: 更文挑战
swift的String类型是值类型。如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数或方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作
字符串的初始化
var emptyString = "" //通过字面量初始化空字符串
let someString = "hello world" //通过字面量初始化字符串
var anotherEmptyString = String() // 初始化方法
//Character的数组初始化字符串
let charactersStr: [Character] = ["s", "w", "i", "f", "t"]
let str = String(charactersStr)
字符串判空
使用isEmpty属性
if keyNote.isEmpty {
print("空空如也")
}
多行字符串
由一对三个双引号 """包裹着的具有固定顺序的文本字符集
let str = """
如果说冬天的北京出奇的冷
那我让你感受下冬天的杭州
"""
print(str)
log:
如果说冬天的北京出奇的冷
那我让你感受下冬天的杭州
可变字符串(var)
swift中的可变字符串与OC中的可变字符串不同,OC在两个类(NSString和NSMutableString)之间进行选择,swift用let和var作区别
var message = "产品经理"
message += "要怎样?" //产品经理要怎样?
计算字符串长度(count)
var string = "产品经理要怎样"
print(string.count) // 7
字符串遍历
- 通过
for-in循环遍历字符串来访问String的各个Character值
for character in "swift" {
print(character)
}
log:
s
w
i
f
t
- 使用
indices属性会创建一个包含全部索引的范围(Range),用来在一个字符串中访问单个字符。
let someString = "dog"
for index in someString.indices {
print(someString[index])
}
// d
// o
// g
字符串拼接
let message = "产品经理"
let result = "\(message)要怎样?" //产品经理要怎样?
- String值可以与加法运算符
+添加(或连接)在一起来创建新String值
let str1 = "产品经理"
let str2 = "要怎样?"
var message = str1 + str2 //产品经理要怎样?
var message = "产品经理"
message += "要怎样?" //产品经理要怎样?
- 使用String类型的方法
append()将Character值附加到String变量
let mark: Character = "?"
var string = "产品经理要怎样"
string.append(mark) //产品经理要怎样?
字符串的索引
startIndex是获取字符创中的第一个字符的索引endIndex是字符串中最后一个字符的后一个字符的索引(endIndex是字符串索引种的非法下标,超出了字符串的范围)index(before:)得到前面的一个索引index(after:)得到后面的一个索引index(_:offsetBy:)获取对应偏移量的索引
let someString = "developer"
print(someString[someString.startIndex]) //d
print(someString[someString.index(before: someString.endIndex)]) //r
print(someString[someString.index(after: someString.startIndex)]) //e
let index = someString.index(someString.startIndex, offsetBy: 5)
print(someString[index]) //o
字符串的插入
insert(_:at:)可以将单个字符插入到指定索引处的字符串中
var someString = "developer"
someString.insert("!", at: someString.endIndex)
// someString = developer!
insert(contentsOf:at:)指定索引处插入另一个字符串的内容
var someString = "developer"
someString.insert(contentsOf: "are great", at: someString.endIndex)
// someString = developer are great
字符串的删除
remove(at:)要从指定索引处的字符串中删除单个字符
var someString = "developer!"
someString.remove(at:someString.index(before: someString.endIndex))
// someString = developer
removeSubrange(_:)可以在一个字符串的指定索引删除一个子字符串
let range = someString.index(someString.endIndex, offsetBy: -10) ..< someString.endIndex
someString.removeSubrange(range)
// someString = developer
字符串替换
let str = "aa$$bb$$cc$$dd"
let str2 = str.replacingOccurrences(of: "$$", with: "**")
//aa**bb**cc**dd
字符串截取
Swift 里的 SubString 绝大部分函数都跟 String 一样,意味着你可以使用同样的方式去操作 SubString 和 String。然而,String 和 SubString 的区别在于性能优化上,SubString 可以重用原 String 的内存空间,或者另一个 SubString 的内存空间(String 也有同样的优化,但如果两个 String 共享内存的话,它们就会相等)。这一优化意味着你在修改 String 和 SubString 之前都不需要消耗性能去复制内存。 因为它重用了原 String 的内存空间,原 String 的内存空间必须保留直到它的 SubString 不再被使用为止你只有在短时间内需要操作字符串时,才会使用 SubString。当你需要长时间保存结果时,就把 SubString 转化为 String 的实例
let str = "developer"
let index = str.firstIndex(of: "v") ?? str.endIndex
let sub = str[...index] //dev
let sub1 = str[index ..< str.endIndex] //veloper
let sub2 = str[str.startIndex ..< index] //de
// 把结果转化为 String 以便长期存储
let newString = String(sub)
str 是一个 String,意味着它在内存里有一片空间保存字符集。而由于 sub 是 str 的 SubString,它重用了 str 的内存空间。相反,newString 是一个 String —— 它是使用 SubString 创建的,拥有一片自己的内存空间
比较字符串(字符串字符相等、前缀相等和后缀相等)
- 判断字符串/字符是否相等用
==和!=
let str1 = "develop are great"
let str2 = "develop are great"
if str1 == str2 {
print("字符串相同")
}
- 前缀/后缀相等
通过调用字符串的
hasPrefix(_:)、hasSuffix(_:)方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一个String类型的参数,并返回一个布尔值
let romeoAndJuliet = [
"Act 1 Scene 1: Verona, A public place",
"Act 1 Scene 2: Capulet's mansion",
"Act 1 Scene 3: A room in Capulet's mansion",
"Act 2 Scene 1: Outside Capulet's mansion",
"Act 2 Scene 2: Capulet's orchard",
"Act 2 Scene 3: Outside Friar Lawrence's cell"
]
var act1SceneCount = 0
for scene in romeoAndJuliet {
if scene.hasPrefix("Act 1 ") {
act1SceneCount += 1
}
}
print("There are \(act1SceneCount) scenes in Act 1")
//There are 3 scenes in Act 1
var mansionCount = 0
var cellCount = 0
for scene in romeoAndJuliet {
if scene.hasSuffix("Capulet's mansion") {
mansionCount += 1
} else if scene.hasSuffix("Friar Lawrence's cell") {
cellCount += 1
}
}
print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
//3 mansion scenes; 1 cell scenes
字面量中的特殊字符
- \0(空字符)、\(反斜线)、\t(水平制表符)、\n(换行符)、\r(回车符)、"(双引号)、'(单引号)
- Unicode 标量,写成
\u{n}(u为小写),其中n为任意一到八位十六进制数且可用的Unicode位码。
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
let dollarSign = "\u{24}"
let blackHeart = "\u{2665}"
let sparklingHeart = "\u{1F496}"
print(wiseWords) // "Imagination is more important than knowledge" - Einstein
print(dollarSign) // $, Unicode scalar U+0024
print(blackHeart) // ♥, Unicode scalar U+2665
print(sparklingHeart) // 💖, Unicode scalar U+1F496