Swift(八)字符串

43805acd8d830d3b9474ad297792aac7c3b138c21cf29-XaohqW_fw658.jpeg

为了构造一个可变长的字符串,可以创建一个字符串变量并为它设置空的初始值,或者可以采用初始化语法来创建一个新的String实例:

var emptyString = ""               // empty string literal
var anotherEmptyString = String()  // initializer syntax
// these two strings are both empty, and are equivalent to each other

你将表明一个特定的字符串是否可修改,可以通过将其分配给一个变量(此情况下该变量是可以被修改的),或者分配给一个常量(此情况下常量不能被修改):

var variableString = "Horse"  
variableString += " and carriage"  
// variableString 此时的值为 "Horse and carriage"   
let constantString = "Highlander"  
constantString += " and another Highlander"  
// 这会报告一个编译错误(compile-time  error) - 字符串常量不能被修改。

注意:在 Objective-C 和 Cocoa 中,你通过选择两个不同的类( NSString 和 NSMutableString )来指定该字符串是否可以被修改,
Swift 中的字符串是否可以修改仅通过定义的是变量还是常量来决定,实现了多种类型可变性操作的统一。

Swift的String类型是值类型。如果你创建了一个新的字符串值,那么当其在进行常量、变量赋值操作或在函数/方法中传递时,会进行值拷贝。

在不同情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值。值类型在 Structures and Enumerations Are Value Types 中进行了说明。
注意:和 Cocoa 中的 NSString 不同,当你在Cocoa中创建了一个NSString实例,并将其传递给一个函数/方法,或者赋给一个变量,
你永远都是传递或赋值同一个NSString实例的一个引用。除非你有特别需要其进行值拷贝,否则字符串不会进行赋值新副本操作。

Swift默认的字符串拷贝方式保证了在函数或方法中传递的是字符串的值,其明确你独有该字符串的值,无论它从哪儿来。
你可以放心的传递的字符串而其自身不会被更改,除非是你自己更改它。

在后台,Swift 编译器会对字符的使用进行优化,只有在绝对必要的情况下才进行实际的值拷贝操作。这意味着你始终可以将字符串作为值类型的同时获得极高的性能。

---
//字符串长度
let unusualMenagerie = "Koala ????, Snail ????, Penguin ????, Dromedary ????"  
println("unusualMenagerie has \(countElements(unusualMenagerie)) characters") //swift3.0中被废弃, 使用strlen(unusualMenagerie)
// prints "unusualMenagerie has 40 characters"

字符串和字符的值可以通过加法运算符(+)相加(或者说链接)在一起并创建一个新的字符串值:

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

你也可以通过加法赋值运算符(+=)将一个字符串或者字符追加到一个已经存在的字符串变量后面:

var instruction = "look over"
instruction += string2
// instruction now equals "look over there"
 
var welcome = "good morning"
welcome += character1
// welcome now equals "good morning! "

注意:你不能将一个字符串或者字符追加到一个已经存在的字符变量后面,因为一个字符值只能包含一个字符。

推荐阅读更多精彩内容