字符串和字符(Strings and Characters)
1. 字符串的非空、前缀、后缀判断
- 非空判断
String
通过检查其布尔isEmpty
属性来确定值是否为空:
if emptyString.isEmpty {
print("Nothing to see here")
}
// Prints "Nothing to see here"
- 前缀判断
使用hasPrefix()
判断;
let romeoAndJuliet = "Act 1 Scene 1: Verona, A public place"
if romeoAndJuliet.hasPrefix("Act 1")
{
print("hasPrefix")
}else{
print("not hasPrefix")
}
//打印 hasPrefix
- 后缀判断
使用hasSuffix()
判断;
let romeoAndJuliet = "Act 1 Scene 1: Verona, A public place"
if romeoAndJuliet.hasSuffix("place")
{
print("hasSuffix")
}else{
print("not hasSuffix")
}
//打印 hasSuffix
2. 字符串、字符拼接
- 使用
+
运算符拼接String
;
let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome now equals "hello there"
- 使用
+=
运算符拼接String
;
var variableString = "Horse" //variableString为可变字符串,相当于OC中的NSMutableString类型
variableString += " and carriage"
// variableString is now "Horse and carriage"
//-
let constantString = "Highlander" //constantString为不可变字符串,相当于OC中的NSString类型
constantString += " and another Highlander"
// 报错,因为constantString为不可变字符串
// this reports a compile-time error - a constant string cannot be modified
- 使用`String`类型的`append()`方法拼接`Character`(字符);
let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome now equals "hello there!"
___注意:___*`Character`类型只能包含一个字符,所以不能将`Character`或`String`类型的值拼接到上`Character`类型的值上。*
# 3. 字符的使用
可以使用`for in`遍历`String`(字符串)来得到`Character`(字符);
for kkk in "Dog!🐶".characters {
print(kkk)
}
// D
// o
// g
// !
// 🐶
初始化字符:
let exclamationMark: Character = "!"
使用`Character`类型的数组作为参数初始化`String`值:
let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]
let catString = String(catCharacters)
print(catString)
// Prints "Cat!🐱"
# 4. 字符串插值
let multiplier = 3
let message = "(multiplier) times 2.5 is (Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"
使用`\(String)`作为占位符,但待插入的字符串不能包含未转义的反斜杠`(\)`,回车或换行符;
# 5. Unicode
Unicode 是文本编码和表示的国际标准。它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。
`Swift` 的字符串和字符类型是完全兼容 `Unicode` 的,它支持如下所述的一系列不同的 `Unicode` 编码。
`Unicode` 中每一个字符都可以被解释为一个或多个 `unicode` 标量。字符的 `unicode` 标量是一个唯一的21位数字(和名称),例如`U+0061 `表示小写的拉丁字母A `("a")`,`U+1F425` 表示正面站立的鸡宝宝` ("🐥")`。
当 `Unicode` 字符串被写进文本文件或其他存储结构当中,这些 `unicode` 标量将会按照 `Unicode` 定义的集中格式之一进行编码。其包括 `UTF-8` (以8位代码单元进行编码) 和 `UTF-16` (以16位代码单元进行编码)。
#####字符串的 Unicode 表示
- UTF-8 代码单元集合 (利用字符串的 utf8 属性进行访问)
- UTF-16 代码单元集合 (利用字符串的 utf16 属性进行访问)
- 21位的 Unicode 标量值集合 (利用字符串的 unicodeScalars 属性进行访问)
下面由 `D` 、`o`、 `g `和`!!`(`DOUBLE EXCLAMATION MARK`或Unicode标量`U+203C`) 和 `🐶 `(`DOG FACE`或Unicode标量`U+1F436`)组成的字符串中的每一个字符代表着一种不同的表示:
let dogString = "Dog!!🐶"
###### UTF-8
您可以通过遍历字符串的 `utf8` 属性来访问它的 `UTF-8 `表示。其为 `UTF8View`类型的属性,`UTF8View` 是无符号8位 `(UInt8)` 值的集合,每一个 `UIn8` 都是一个字符的 `UTF-8` 表示:

for codeUnit in dogString.utf8 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 226 128 188 240 159 144 182
上面的例子中,前三个10进制代码codeUnit值 `(68, 111, 103) `代表了字符`D`、 `o`、` g ` ,他们的 `UTF-8` 表示与 `ASCII `表示相同。接下来的三个10进制codeUnit值`(226,128,188)`是一个三字节的`UTF-8`表示`!!`的字符。后四个代码单元值 `(240, 159, 144, 182)` 是 狗脸表情 的4位 `UTF-8` 表示。
###### UTF-16
您可以通过遍历字符串的 `utf16` 属性来访问它的 `UTF-16` 表示。其为 `UTF16View` 类型的属性,`UTF16View` 是无符号16位 `(UInt16)` 值的集合,每一个` UInt16 `都是一个字符的 `UTF-16` 表示:

for codeUnit in dogString.utf16 {
print("\(codeUnit) ")
}
print("\n")
//68 111 103 8252 55357 56374
同样,前三个codeUnit值(68,111,103)所表示的字符D,o以及g,其UTF-16代码单元的作为字符串的UTF-8表示相同的值(因为这些Unicode标量代表ASCII字符)。
第四codeUnit值(8252)是十进数,等值十六进制值的203C,它代表了Unicode标U+203C为`!!`字符。此字符可以表示为UTF-16中的单个代码单元。
第五个和第六个codeUnit值(55357和56374)是字符的UTF-16替代对`DOG FACE`表示。第一个值为 `U+D83D` (十进制值为 55357),第二个值为 `U+DC36` (十进制值为 56374)。
###### Unicode 标量 (Scalars)
您可以通过遍历字符串的 unicodeScalars 属性来访问它的 Unicode 标量表示。其为 UnicodeScalarView 类型的属性,UnicodeScalarView 是 UnicodeScalar 的集合。UnicodeScalar 是21位的 Unicode 代码点。
每一个 UnicodeScalar 拥有一个值属性,可以返回对应的21位数值,用 UInt32 来表示。

for scalar in dogString.unicodeScalars {
print("\(scalar.value) ")
} // 68 111 103 8252 128054
- 单字节 Unicode 标量,写成 `\xnn`,其中 `nn` 为两位十六进制数。
- 双字节 Unicode 标量,写成 `\unnnn`,其中 `nnnn` 为四位十六进制数。
- 四字节 Unicode 标量,写成 `\Unnnnnnnn`,其中 `nnnnnnnn` 为八位十六进制数。
___Note: ___ * A Unicode scalar is any Unicode code point in the range `U+0000` to `U+D7FF` inclusive or `U+E000` to `U+10FFFF` inclusive. Unicode scalars do not include the Unicode surrogate pair code points, which are the code points in the range `U+D800` to `U+DFFF` inclusive. *
# 6. 字符串字面量中的特殊字符
字符串文字可以包含以下特殊字符:
- ` \0`(空(null)字符),` \\\\ ` (反斜杠),`\t` (制表符),` \n` (换行符),`\r`(回车) ,`\"` (双引号), `\' `(单引号);
- 任意一个Unicode标量,写为`\u{n}`,其中`n`是`1-8`位十六进制数,值等于有效的Unicode代码点;
let wiseWords = ""Imagination is more important than knowledge" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\u{24}" // $, Unicode scalar U+0024
let blackHeart = "\u{2665}" // ♥, Unicode scalar U+2665
let sparklingHeart = "\u{1F496}" // 💖, Unicode scalar U+1F496
# 7. 扩展格式集群
Swift中每个 `Character`类型的实例表示单个扩展的字形集群。扩展的字形集群是一个或多个Unicode标量按顺序组合时产生单个可读字符。
- 示例1:
let eAcute: Character = "\u{E9}" // é
let combinedEAcute: Character = "\u{65}\u{301}" // e followed by ́
// eAcute is é, combinedEAcute is é
//在第一种情况下,是包含单个标量的集群; 在第二种情况下,它是两个标量的集群:
- 示例2:
let precomposed: Character = "\u{D55C}" // 한
let decomposed: Character = "\u{1112}\u{1161}\u{11AB}" // ᄒ, ᅡ, ᆫ
// precomposed is 한, decomposed is 한
- 示例3:
let enclosedEAcute: Character = "\u{E9}\u{20DD}"
// enclosedEAcute is é⃝
- 示例4:
let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}"
// regionalIndicatorForUS is 🇺🇸
# 8. 字符串的数量计算
使用`String`的`characters`属性的`count`属性计算字符串的数量;
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
print("unusualMenagerie has (unusualMenagerie.characters.count) characters")
// Prints "unusualMenagerie has 40 characters"
Swift对于Character值使用扩展字形集群意味着字符串连接和修改可能不会总是影响字符串的字符计数。
例如,如果使用四字符单词初始化一个新字符串cafe,然后在字符串的末尾附加一个COMBINING ACUTE ACCENT(U+0301),则生成的字符串仍然会有一个字符计数4,第四个字符é不是e:
var word = "cafe"
print("the number of characters in (word) is (word.characters.count)")
// Prints "the number of characters in cafe is 4"
word += "\u{301}" // COMBINING ACUTE ACCENT, U+0301
print("the number of characters in (word) is (word.characters.count)")
// Prints "the number of characters in café is 4"
# 9. 访问、插入、删除、替换字符串
- 访问字符串中的字符
print(greeting[greeting.startIndex])
// G
print(greeting[greeting.index(before: greeting.endIndex)])
// !
print(greeting[greeting.index(after: greeting.startIndex)])
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
print(greeting[index])
// a
使用`characters`属性的`indices`属性来访问字符串中单个字符的所有索引。
for index in greeting.characters.indices {
print("(greeting[index]) ", terminator: "")
}
// Prints "G u t e n T a g ! "
- 插入
使用`insert(_:at:)`方法在指定索引处插入单个字符到字符串中;使用`insert(contentsOf:at:)`方法在指定索引处插入另一个字符串。
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!";插入单个字符
//-
welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!";插入一个字符串
- 删除
使用`remove(at:)`方法从字符串中删除指定索引的单个字符;使用`removeSubrange(_:)`方法删除指定范围内的子字符串。
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there"
//-
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome now equals "hello"
- 替换
使用`replacingOccurrences(of:with:)`来替换字符串中的某一字符串。
welcome = welcome.replacingOccurrences(of: "om", with: "")
//welcome now equals "welce"
[参考链接1](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html#//apple_ref/doc/uid/TP40014097-CH7-ID285)
[参考链接2](http://c.biancheng.net/cpp/html/2270.html)
[参考链接3](http://www.bubuko.com/infodetail-822365.html)
*用来记录平时遇到的问题,不对之处还望指教。*
网友评论