Swift 易忽略的笔记 2):String

1. String

“Swift’s String type is a value type. If you create a new String value, that String value is copied when it is passed to a function or method, or when it is assigned to a constant or variable. In each case, a new copy of the existing String value is created, and the new copy is passed or assigned, not the original version. ”


This behavior differs from that of NSString in Cocoa. When you create an NSString instance in Cocoa, and pass it to a function or method or assign it to a variable, you are always passing or assigning a reference to the same single NSString. No copying of the string takes place, unless you specifically request it.”

“Swift’s copy-by-default String behavior ensures that when a function or method passes you a String value, it is clear that you own that exact String value, regardless of where it came from. ”

2. Character

let yenSign: Character = "¥"

for character in "Dog!XXX" {

let string1 = "hello"
let string2 = " there"
let character1: Character = "!"
let character2: Character = "?"
let stringPlusCharacter = string1 + character1        // equals "hello!"

3. Unicode

let dogString = "Dog!XXX"


for codeUnit in dogString.utf8 {
    print("\(codeUnit) ")
// 68 111 103 33 240 159 144 182”

“In the example above, the first four decimal codeUnit values (68, 111, 103, 33) represent the characters D, o, g, and !, whose UTF-8 representation is the same as their ASCII ”
“representation. The last four codeUnit values (240, 159, 144, 182) are a four-byte UTF-8 representation of the DOG FACE character.”


for codeUnit in dogString.utf16 {
    print("\(codeUnit) ")
// 68 111 103 33 55357 56374”

Unicode Scalars
You can access a Unicode scalar representation of a String value by iterating over its unicodeScalars property. This property is of type UnicodeScalarView, which is a collection of values of type UnicodeScalar. A Unicode scalar is any 21-bit Unicode code point that is not a lead surrogate or trail surrogate code point.

Each UnicodeScalar has a value property that returns the scalar’s 21-bit value, represented within a UInt32 value:

for scalar in dogString.unicodeScalars {
    print("\(scalar.value) ")
// 68 111 103 33 128054
The value properties for the first four UnicodeScalar values (68, 111, 103, 33) once again represent the characters D, o, g, and !. The value property of the fifth and final UnicodeScalar, 128054, is a decimal equivalent of the hexadecimal value 1F436, which is equivalent to the Unicode scalar U+1F436 for the DOG FACE character.

As an alternative to querying their value properties, each UnicodeScalar value can also be used to construct a new String value, such as with string interpolation:

for scalar in dogString.unicodeScalars {
    println("\(scalar) ")
// D
// o
// g
// !
// XXX