Swift 4.0學(xué)習(xí)之旅—字符串和字符

 //在swift中 String 可以調(diào)用OC中的 NSString方法 不用進(jìn)行轉(zhuǎn)換
        //字符串的字面量 可以用于為常量和變量提供初始值
        let str = "hello world"
        
        //多行字符串字面量 與oc /**/注釋相似
        let string = """
                    a
                    b
                    c
                    d
                    e
                    """
        print(string)
        
        //上面代碼中 換行已經(jīng)包含在內(nèi) 如果不想這么寫還想要有換行 用\n來代替 與oc一樣
        let hh = "hello \n world"
        print( hh)
        
        //在多行中不希望有多行樣式 在""" 字符串中 每行字符串尾部用\ 來當(dāng)做續(xù)行 不是換行 """
        //這樣方便可讀性
        //但是""" 符號(hào)必須獨(dú)占一行才行
        let hello = """
        hello world duo hang \
        i love the world
        """
        
        //在多行中 以末尾"""符號(hào)位置為基準(zhǔn) 若各行有字符創(chuàng)超出了末尾 """ 則超出的部分包含在字符串中
        print("""
        123
         456
          789
        """)
        //超出某位的"""第一個(gè)“符號(hào) 都作為空格來處理
        
//        print("""
//    123
//        456
//        789
//        """)
//這么寫或報(bào)錯(cuò) 說是以下各行縮進(jìn)不足 所以 所有的字符串換行后 都不能超過某位的”“”位置
        
        //轉(zhuǎn)義字符
//  \0 空字符 \\反斜線 \t水平制表符 \n換行符 \r回車符 \"雙引號(hào) \'單引號(hào)
        
        //Unicode標(biāo)量 寫成\u{n} u為小寫,n為任意一到八位十六進(jìn)制數(shù)切可用的unicode編碼
        
        print("\"注釋 \"")
        print("\u{24}")
        print("\u{2665}")
        print("\u{1F496}")
        
        //若在多行字符串中使用""" 必須要用一個(gè)\符號(hào)來轉(zhuǎn)義
        print("""
        Escaping the first quote \"""
        Escaping all three quotes \"\"\"
        """)
        
        //初始化一個(gè)空字符串
        var nilStr = ""
        var emptyStr = String()
        //以上兩個(gè)字符串為空 且等價(jià)
        
        //判斷字符串是否為空
        if nilStr.isEmpty{
            print("empty str")
        }
        
        //字符串可變性 var為變量
        var variablestr = "hello"
        variablestr += " world"
        
        let str1 = "hello"
//        str1 += "world"http://此時(shí)報(bào)錯(cuò) 因?yàn)閟tr1定義為常量
        
        //for in 語句來循環(huán)輸出 字符串中沒每個(gè)字符
        
        for 字符 in "hello world"{
            print(字符)
        }
        
        //可以通過 character 來定義 并進(jìn)行字符字面量賦值,可以作為一個(gè)獨(dú)立的字符量或變量
        let worldI : Character = "i"

        //可以把一個(gè)字符集合 通過String來初始化成一個(gè)字符串
        let chars : [Character] = ["a","b",worldI]
        let charStr = String(chars)
        print(charStr)
        
        //使用加號(hào)來連接兩個(gè)字符串
        let string1 = "string1"
        let string2 = "string2"
        var string3 = string1 + string2
        
//        var string4 = string3 + worldI 類型不同峡蟋,不能相加
        let string5 : NSString = "oc"
        
//        var string6 = string3 + string5 類型不同 得強(qiáng)轉(zhuǎn)
         var string6 = string3 + (string5 as String)
        
        print(string3,string6)
        
        //使用+= 來將一個(gè)字符串添加到一個(gè)已經(jīng)存在的字符串變量上
        var string7 = "default"
        string7 += string6
        
        //使用append 將一個(gè)字符追加到一個(gè)字符串的尾部 也可以是字符串 append方法可以追加很多
        let charchar : Character = "i"
        string7.append(charchar)
        string7.append(string1)
        
        //Unicode 用于文本的編碼和表示 可以用標(biāo)準(zhǔn)格式表示來自任意語言幾乎所有的在字符轧拄,并能夠?qū)ξ谋净蚓W(wǎng)頁這樣的外部資源中的在字符進(jìn)行讀寫操作,Swift的string 和 character 類型是完全兼容Unicode
        //Unicode標(biāo)量
        //Swift 的string類型是基于Unicode標(biāo)量簡歷的是钥。Unicode標(biāo)量是對應(yīng)字符或者修飾符的唯一的21位數(shù)字
        //Unicode碼位的范圍 U+0000 到 U+D7FF 或者 U+E000 到 U+10FFFF
        //Unicode標(biāo)量不八廓Unicode代理項(xiàng)碼位 范圍是 U+D800 到 U+DFFF
        //不是所有的21位Unicode 標(biāo)量都代表一個(gè)字符
        
        
        //單一標(biāo)量
        let eacute : Character = "\u{E9}" //é
        //兩個(gè)標(biāo)量字形群
        let combineddeacute : Character = "\u{65}\u{301}"
        print(eacute,combineddeacute)

        
        //單一標(biāo)量
        let precomposed : Character = "\u{D65c}"
        //組合標(biāo)量排序 為同一個(gè)字
        let decomposed : Character = "\u{1112}\u{1161}\u{11AB}"
        print(precomposed,decomposed)

        //測試標(biāo)量組合 不能顛倒
//        let teststr : Character = "\u{1161}\u{1112}\u{11AB}"
//        print(teststr)
        
        //可擴(kuò)展的字符群可以使包圍記號(hào) U+20DD 標(biāo)量包圍其他Unicode標(biāo)量鳖宾,作為一個(gè)單一的character值
        print("\u{E9}\u{20DD}") //é?  圓形包含
        
        //地域性指示符號(hào)Unicode 標(biāo)量可以組合成一個(gè)單一的character值
        // US 符號(hào) 組合 U (U+1F1FA)  S (S+1F1F8)
        print("\u{1F1FA}\u{1F1F8}") //???? 美國國旗
        
        
        
        //字符數(shù)量 用count 來知道字符串內(nèi)含有多少個(gè)字符
        let teststring = "hello world"
        print("teststring has \(teststring.count) charracter")
        
        //使用字符群集作為 character值來改變字符串時(shí)瑞信,并不一定會(huì)改變字符串?dāng)?shù)量
        var word = "cafe"
        print(word + "has \(word.count) character")
        
        word += "\u{301}"
        
        print("\(word) has \(word.count) character")
        
        //NSString 的 length數(shù)量 與 Unicode 數(shù)量并不總是是相同
        //NSString 是 UTF-16表示的單元數(shù)字
        
        //Swift string值關(guān)聯(lián)的索引類型 string.index 對應(yīng)每個(gè)character的位置
        //Swift 中 字符串不能用 integer做索引
        
        //用startIndex 獲取一個(gè)string 的第一個(gè)character索引 使用endIndex獲取最后一個(gè)character位置的索引
        //但是 endIndex不能作為一個(gè)字符串的郵箱下標(biāo) 如果 stirng 為空串 startindex 與endindex相等
        
        //可以使用 string index(before:)獲取某一下標(biāo)前面  index(after:)獲取某一下標(biāo)后面  index(_:offsetby:)獲取某一下標(biāo)的偏移量 避免多次使用前兩個(gè)
        //三種方法也可以用在 array dictionary set中
        
        let indexString = "hello world"
        
        print(indexString[indexString.startIndex])
        
//        print(indexString[indexString.endIndex]) 代碼出錯(cuò) 因?yàn)閑ndindex 為字符串最后一個(gè)字符末尾 往后一位為空字符
        
        print(indexString[indexString.index(before: indexString.endIndex)]) //d
        print(indexString[indexString.index(after: indexString.startIndex)]) //e
        print(indexString[indexString.index(indexString.startIndex, offsetBy: 5)]) //因?yàn)榭崭?所以看不出來
        print(indexString[indexString.index(indexString.startIndex, offsetBy: 6)]) //w
        
        //indices  為字符串所有索引范圍 range 用來訪問單個(gè)字符   indices 目錄
        for indexx in indexString.indices{
//            print(indexString[indexx])
            print(indexString[indexx], separator:"-", terminator: " ") //由于打印的是單個(gè)字符 所以連接符沒有起到作用
            //terminator 默認(rèn)是添加換行符光羞,若果換成別的 就不起到換行效果,會(huì)連接下個(gè)print語句打印的內(nèi)容
        }
        
        print(indexString.indices)
        
        //插入
        var welcome = "welcome"
        //在末尾加一個(gè)感嘆號(hào) 在一個(gè)指定索引加一個(gè)單個(gè)字符
        welcome.insert("!", at: welcome.endIndex)
        print(welcome)
        
        //在感嘆號(hào)前加一段 字符串 在一個(gè)指定索引加一段字符串
        welcome.insert(contentsOf: " to China", at: welcome.index(before: welcome.endIndex))
        print(welcome)
        
        //刪除某個(gè)下標(biāo)的字符
        welcome.remove(at: welcome.index(before: welcome.endIndex))//刪除感嘆號(hào)
        print(welcome)
        
        //刪除一端 指定范圍的字符串
        welcome.removeSubrange(welcome.index(welcome.endIndex, offsetBy: -8)..<welcome.endIndex)//刪除to china
        print(welcome)
        
        //子字符串
        let testSTR = "hello,world"
        let index_ = testSTR.index(of: ",") ?? testSTR.endIndex  //義為 字符串testSTR 中有”,“ 這個(gè)字符下標(biāo)嗎 有的話就用這個(gè)字符下標(biāo) 怀大,沒有的話 就用末尾下標(biāo)
        let fix = testSTR[..<index_] //往字符串里傳一個(gè)范圍 返回這個(gè)范圍內(nèi)的所以字符串
        //此時(shí) fix 為substring類型的實(shí)例 需要另起一個(gè)string 類型的 去接收以便長久化
        
        let newFix = String(fix)
        
        print(fix,newFix)//hello hello
        
        //string 與substring 區(qū)別在于性能優(yōu)化上纱兑,substring 可以重用原string 的內(nèi)存空間,或者另一個(gè)substring,string也一樣
        //意味著在修改string 和substring 之前都不需要消耗內(nèi)存去復(fù)制內(nèi)存化借∏鄙鳎可以直接修改
        
        //疑問 若果修改substring 會(huì)不會(huì)修改原string
        
        var sourstr = "helloworld"
        var substr = String(sourstr[sourstr.startIndex..<sourstr.index(sourstr.startIndex, offsetBy: 5)])
        print(substr)
        
        substr = "welcome"
        print(sourstr) //事實(shí)不會(huì)
        
        //string 與substring 都可以調(diào)用 stringprotocol的函數(shù)
        
        //字符串比較 三種比較方式  字符串字符相等,前綴和后綴相等
        
        let me = "i like you"
        let me1 = "i like you"
        
        let you = "you like i" //me
        
        if me == me1{
            print("same string")
        }
        
        //如果兩個(gè)字符串的可擴(kuò)展字形集群是相等的蓖康,那它們就是相等的铐炫,在這個(gè)情況下,即使可擴(kuò)展的字形集群集是有不同的Unicode標(biāo)量構(gòu)成的蒜焊,只要它們有相同的語言意義和外觀倒信,就認(rèn)為它們標(biāo)準(zhǔn)相等
        
        //ex:
        let e = "\u{E9}"
        let oe = "\u{65}\u{301}"
        
        if e == oe {
            print("same string")
        }
        
        let arrar = ["abc","abd","abe","bbc","bbd","bbe"]
        var sameprefix = 0
        var samesuff = 0
        
        for str in arrar{
            if str.hasPrefix("a"){
                sameprefix += 1 //md 不能用++ 來代表自加
            }else if str.hasSuffix("c"){
                samesuff += 1
            }
        }
        print("arr has \(sameprefix) sameprefix  , has \(samesuff) suff")
        
        //字符串的Unicode表示形式
        //每一個(gè)字符串中的小塊編碼都被稱作代碼單元,這些包括UTF-8編碼格式(編碼字符為8位的代碼單元) UTF-16 UTF-32
        //其中 21位的Unicode 標(biāo)量值集合泳梆,也是字符串的UTF-32編碼格式
        
        //可以通過string 的 utf8屬性來訪問它的UTF-8表示 鳖悠。
        //為 string.UTF8View  值為無符號(hào)8位(Uint8)的集合 每一個(gè)Uint8值都是一個(gè)字符UTF-8表示
        //使用為字符串.utf8
        
        let dogstr = "a little dog"
        for codeUint in dogstr.utf8{
            print("\(codeUint)",terminator:" ")
        }
        //輸出為97 32 108 105 116 116 108 101 32 100 111 103
        //字母部分與ASCII表示相同
        
        for codeUint in dogstr.utf16{
            print("\(codeUint)",terminator:" ")
        }
       
        //Unicode的標(biāo)量表示  通過string unicodescalars 來訪問標(biāo)量表示 其為UnicodeScalarView 類型屬性榜掌,
        //UnicodeScalarView 為UnicodeScalar類型的集合
        let bigDog = "dog!!??"
        
        for scalar in bigDog.unicodeScalars{
            print(scalar.value,terminator:" ")// .value 就是.UInt32
        }
        
        //其實(shí)似懂非懂,主要還是想知道用在何處乘综,鍵盤憎账?火星文輸入法?自定義字的組合卡辰?
        
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胞皱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子九妈,更是在濱河造成了極大的恐慌反砌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件允蚣,死亡現(xiàn)場離奇詭異于颖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嚷兔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門森渐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冒晰,你說我怎么就攤上這事同衣。” “怎么了壶运?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵耐齐,是天一觀的道長。 經(jīng)常有香客問我蒋情,道長埠况,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任棵癣,我火速辦了婚禮辕翰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狈谊。我一直安慰自己喜命,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布河劝。 她就那樣靜靜地躺著壁榕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赎瞎。 梳的紋絲不亂的頭發(fā)上牌里,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音务甥,去河邊找鬼二庵。 笑死贪染,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的催享。 我是一名探鬼主播杭隙,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼因妙!你這毒婦竟也來了痰憎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤攀涵,失蹤者是張志新(化名)和其女友劉穎铣耘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體以故,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜗细,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怒详。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炉媒。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昆烁,靈堂內(nèi)的尸體忽然破棺而出吊骤,到底是詐尸還是另有隱情,我是刑警寧澤静尼,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布白粉,位于F島的核電站,受9級(jí)特大地震影響鼠渺,放射性物質(zhì)發(fā)生泄漏鸭巴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一拦盹、第九天 我趴在偏房一處隱蔽的房頂上張望鹃祖。 院中可真熱鬧,春花似錦掌敬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至地熄,卻和暖如春华临,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背端考。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工雅潭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揭厚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓扶供,卻偏偏與公主長得像筛圆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子椿浓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容