Welcome to Swift ,苹果官方Swift文档初译与注解十九---123~132页

Working with Characters (与字符相关)

  在Swift中,String类型表示一组有序字符的值.每个字符都是一个Unicode符号.可以使用for-in循环来遍历字符串中的每个字符:

    for character in "Dog!????" {

     println(character)

    }

    // D

    // o

    // g

    // !

    // ????

  在Swift中也可以使用Character类型来显式的创建一个单字符的常量或者变量:

    let yenSign: Character = "¥"

Counting Characters (计算字符个数)

  调用全局函数countElements,传递一个字符串作为它的参数,可以计算出这个字符串中字符的数量:

    let unusualMenagerie = "Koala ????, Snail ????, Penguin ????, Dromedary ????"

    println("unusualMenagerie has \(countElements(unusualMenagerie)) characters")

    // prints "unusualMenagerie has 40 characters”

  注意点:

  不同的Unicode字符,以及相同Unicode字符不同的表示,他们需要的内存存储空间是不同的.因此字符与表示这个字符的字符串有时候的存储空间也是不同的.这样以来,一个字符串的  长度就必须依据通过遍历它的每个字符来计算获得.如果你要处理一个特别长的字符串,请注意,为了准确的计算出字符串的长高度,一定要确保countElements函数遍历了每个字符.

  countElements函数返回的字符数与NSString的length属性表示的字符数会有不一致的时候.NSString的length是根据UTF-16格式编码的字符串中16位单元码个数来计算的,而不是  依据字符串中Unicode字符个数来计算的.根据这种情况,NSString的length属性在Swift中被视为 utf16count.

Concatenating Strings and 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!”

  注意点:

  不能给一个字符变量追加一个字符串或者字符,因为一个字符类型的值只能存储一个字符.

String Interpolation (字符串拼接插入操作)

  字符串的拼接插入操作是构建新的字符串的一种方式,通过混合组织常量,变量,文本以及表达式的值在这个字符串文本中.插入到字符串文本中的每个条目都用括号()包住,并在前面写  上饭斜杠(\):

    let multiplier = 3

    let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"

    // message is "3 times 2.5 is 7.5”

  在上面的例子中,multiplier 的值通过\(multiplier)方式插入到字符串文本中.当执行字符串插入运算的时候,\(multiplier)的位置会被multiplier的实际值取代,从而创建一个明确的字符   串.

  字符串末端的multiplier的值是长表达式的一部分.表达式计算出 Double(multiplier) * 2.5的值,然后将计算结果值 (7.5)插入到字符串中.在例子中,是使用 \(Double(multiplier) *    2.5)方式将值包含到字符串中.

  注意点:

  写字括号()里面的表达式不能包含双引号”或者反斜杠\,也不能包含回车或者换行符.

Comparing Strings (字符串比较)

  在Swift中提供了三种方式比较字符串:字符串相等,前缀相等,和后缀相等

String Equality (字符串相等)

  如果两个字符串包含的相同次序的字符,那么这两个字符串相等:

    let quotation = "We're a lot alike, you and I."

    let sameQuotation = "We're a lot alike, you and I."

    if quotation == sameQuotation {

     println("These two strings are considered equal")

    }

    // prints "These two strings are considered equal”

Prefix and Suffix Equality (前缀和后缀相等)

  调用字符串的 hasPrefix 和 hasSuffix方法,可以检查一个字符串中是否有指定的前缀或后缀字符串.这两个方法都只带一个String类型的参数,并返回一个布尔类型的值.这个方法都会  进行逐字符的进行比较.

  下面的代码例子中,字符串数组表示了Shakespeare’s Romeo and Juliet(莎士比亚的罗密欧与 朱丽叶)前两章情景:

    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 1 Scene 4: A street outside Capulet's mansion",

     "Act 1 Scene 5: The Great Hall 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",

     "Act 2 Scene 4: A street in Verona",

     "Act 2 Scene 5: Capulet's mansion",

     "Act 2 Scene 6: Friar Lawrence's cell"

    ]

你可以使用 hasPrefix方法来计算这个戏剧章节1中场景的数量:

    var act1SceneCount = 0

    for scene in romeoAndJuliet {

     if scene.hasPrefix("Act 1 ") {

     ++act1SceneCount

     }

    }

    println("There are \(act1SceneCount) scenes in Act 1")

    // prints "There are 5 scenes in Act 1”

  同样的,你也可以使用Capulet’s mansion 和 Friar Lawrence’s cell作为参数,通过hasSuffix方法来计算场景数:

    var mansionCount = 0

    var cellCount = 0

    for scene in romeoAndJuliet {

     if scene.hasSuffix("Capulet's mansion") {

     ++mansionCount

     } else if scene.hasSuffix("Friar Lawrence's cell") {

     ++cellCount

     }

    }

    println("\(mansionCount) mansion scenes; \(cellCount) cell scenes")

    // prints "6 mansion scenes; 2 cell scenes”

Uppercase and Lowercase Strings (字符串的大小写转换)

  通过uppercaseString 和lowercaseString属性,可以进行大写或者小写的存储访问:

    let normal = "Could you help me, please?"

    let shouty = normal.uppercaseString

    // shouty is equal to "COULD YOU HELP ME, PLEASE?"

    let whispered = normal.lowercaseString

    // whispered is equal to "could you help me, please?”