美文网首页Swift基础学习
Swift3.0字符串和字符(Strings and Chara

Swift3.0字符串和字符(Strings and Chara

作者: Mustard_Buli | 来源:发表于2016-07-18 10:08 被阅读2260次

    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(_:)"方法来判断结尾处。

    相关文章

      网友评论

        本文标题:Swift3.0字符串和字符(Strings and Chara

        本文链接:https://www.haomeiwen.com/subject/qavejttx.html