Swift中String代表字符串类型。Swift中的"String"类型无缝桥接了Foundation框架中的"NSString"类型。
初始化空的String(Initializing an Empty String)
var emptyString = ""
var anotherEmptyString = String()
判断String是否为空,可以通过布尔类型的"isEmpty"属性:
if emptyString.isEmpty {
print("Nothing to see here")
}
//Prints "Nothing to see here"
字符串是值类型(Strings Are Value Types)
Swift 默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值,其明确了无论该值来自于哪里,都是你独自拥有的。你可以放心你传递的字符串本身不会被更改。
在实际编译时,Swift编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着你始终可以将字符串作为值类型的同时获得极高的性能。
使用字符(Working with Characters)
for characters in "Dog!🐶".characters {
print(characters)
}
// D
// o
// g
// !
// 🐶
String可以通过Character数组初始化得到
🌰
字符串的插入(String Interpolation)
🌰Unicode
Unicode标量(Scalars)
Swift的String类型就在Unicode标量的基础上建立的.每一个字符或者修饰符(modifier)都是独一无二的21位数的Unicode标量。🌰:"U+0061"就是小写的拉丁字母A("a"),或者U+1F425就是正面的小鸡("🐥")。
U+0061 for LATIN SMALL LETTER A ("a"), or U+1F425 for FRONT-FACING BABY CHICK ("🐥").
不是所有的Unicode变量都对应一个字符,有可能是预留出来的。每个Unicode标量都有一个自己的名字,参考上面🌰。
字符串字面量中的特殊字符(Special Characters in String Literals)
字符串字面量中可以包括下面这些特殊的字符:
- 转义字符
\0 (空字符,null character)
\\ (反斜杠,backslash)
\t (水平制表符,horizontal tab)
\n (换行符,line feed)
\r (回车,carriage return)
\" (双引号,double quote)
\' (单引号,single quote)
-
任意的Unicode标量,写法是"\u{n}",其中n是1-8位的16进制数,代表一个有效的Unicode代码点。
🌰
计算字符个数(Counting Characters)
为了得到一个字符串中字符的数量,可以使用字符串的"characters"属性的"count"属性:
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")
// Prints "unusualMenagerie has 40 characters"
Swift在字符的值上使用的扩展字符集群,也就是说,在某些连接、修改的情况下,不会出现字符串长度的变化。
🌰:
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"
得到和修改字符串(Accessing and Modifying a String)
可以通过String的方法、属性或者使用下标语法。
字符串索引值(String Indices)
不同的字符需要不同大小的内存来进行存储,所以为了决定Character在一个特殊的位置,你就必须要从一个字符串的起始到终止位置重复每一个Unicode标量。因为这个原因,Swift的字符串不能用整型值来索引。
let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a
插入和移除(Inserting and Removing)
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!"
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"
字符串的比较(Comparing Strings)
字符串和字符相等(String and Character Equality)
let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
print("These two strings are considered equal")
}
// Prints "These two strings are considered equal"
如果两个字符串值(字符值)得扩展字符集群具有统一码等价性(canonically equivalent),那么就被认为是相等的。
🌰:
// "Voulez-vous un café?" using LATIN SMALL LETTER E WITH ACUTE
let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"
// "Voulez-vous un café?" using LATIN SMALL LETTER E and COMBINING ACUTE ACCENT
let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"
if eAcuteQuestion == combinedEAcuteQuestion {
print("These two strings are considered equal")
}
// Prints "These two strings are considered equal"
但是存在下面这种情况,虽然看起来是一样的,但是因为Unicode标量不同,所以不相等:
let latinCapitalLetterA: Character = "\u{41}"
//斯拉夫字母A,用于俄语当中
let cyrillicCapitalLetterA: Character = "\u{0410}"
if latinCapitalLetterA != cyrillicCapitalLetterA {
print("These two characters are not equivalent.")
}
// Prints "These two characters are not equivalent."
前缀/后缀相等(Prefix and Suffix Equality)
🌰类似的,用"hasSuffix(_:)"方法来判断结尾处。
网友评论