亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Swift語言指南(十)--字符串與字符

2019-11-14 20:23:58
字體:
來源:轉載
供稿:網友

字符串是一段字符的有序集合,如"hellow,world"或"信天翁"。Swift 中的字符串由 String 類型表示,對應著 Character 類型值的集合。

Swift 中的 String 類型為你的編程提供了一個高速的,兼容 Unicode規范 的文本處理方式。Swift 創建和處理字符串的語法輕量可讀,與 C 語言的字符串語法頗為相似。字符串的拼接非常簡單,只需將兩個字符串用 + 運算符相加。字符串的值是否可變取決于其為常量還是變量,這一點與 Swift 中的其它類型一致。

Swift 的 String 類型除了語法簡潔之外,還是一個高速,現代化的字符串實現方案。每個字符串均由編碼獨立的 Unicode 字符組成,每個字符均支持以不同的 Unicode 表達形式訪問。

Swift 的字符串還支持在較長的字符串中插入常量、變量、字面量以及表達式的值,該過程稱為字符串插入。這使得顯示、存儲以及輸出自定義的字符串值更加簡便。

注:

Swift 的 String 類型與底層 Foundation 的 NSString 類無縫銜接。如果你在 Cocoa / Cocoa Touch 中使用 Foundation 框架,那么,除了本章提到的 String 特性之外,對創建的任何 String 值,均可調用到 NSString 類的全部 API。還可以將 String 值傳遞給任何需要 NSString 實例的 API 方法。

更多 String 與 Foundation / Cocoa 框架結合使用的信息,請見 Swift 與 Cocoa 及 Objective-C 的結合(這一部分內容在本書之外,譯完本書再譯)。

 

字符串字面量

代碼中可以在預先定義的 String 值中嵌入字符串字面量string literal)。字符串字面量是由一對雙引號("")包圍的文本字符的固定序列。

字符串字面量可以為一個常量或變量提供初始值:

let someString = "Some string literal value"

注意,Swift 推斷常量 someStringString 類型,因為 someString 的值被一個字符串字面量初始化了。

字符串字面量涵蓋了下述特殊字符:

· 轉義過的特殊字符: /0(null 字符),// (反斜杠,轉義后應為單斜杠--Joe.Huang),/t(水平制表符),/n(換行符),/r(回車符),/"(雙引號)以及 /'(單引號)

· 單字節的 Unicode 標量,寫作 /xnn,其中 nn 為兩個十六進制數位

· 雙字節的 Unicode 標量,寫作 /unnnn,其中 nnnn 為四個十六進制數位

· 四字節的 Unicode 標量,寫作 /Unnnnnnnn,其中 nnnnnnnn 為八個十六進制數位

下面的代碼展示了這幾種特殊字符的例子。常量 wiseWords 包含兩個轉義后的雙引號字符。常量 dollarSign、blackHeart 以及 sparklingHeart 展示了 Unicode 標量字符的三種不同書寫格式:

let wiseWords = "/"Imagination is more important than knowledge/" - Einstein"// "Imagination is more important than knowledge" - Einstein// 輸出 "想象力比知識更重要" - 愛因斯坦let dollarSign = "/x24"        // 輸出 $,  Unicode 標量 U+0024let blackHeart = "/u2665"      // 輸出 ♥,  Unicode 標量 U+2665let sparklingHeart = "/U0001F496"  // 輸出 , Unicode 標量 U+1F496

 

初始化一個空字符串

創建一個較長的字符串,第一步,需要創建一個空的 String 值,你既可以將空字符串字面量賦值給一個變量,也可以用初始化語法初始化一個新的 String 實例:

1 var emptyString = ""               // 空字符串字面量2 var anotherEmptyString = String()  // 初始化語法3 // 這兩個字符串對象都是空值, 互相等同

你可以使用 isEmpty 屬性檢測字符串的值是否為空:

1 if emptyString.isEmpty {2     PRintln("Nothing to see here")3 }4 // 輸出 "什么都沒看到"

 

字符串的可變性

一個特定 String 的值是否可以修改(即可變,mutable),可通過聲明將其賦值給一個變量(可以修改)或常量(不可修改):

1 var variableString = "Horse"2 variableString += " and carriage"3 // variableString 的值現在為 "Horse and carriage"4  5 let constantString = "Highlander"6 constantString += " and another Highlander"7 // 編譯錯誤 - 常量 string 的值不可更改

注:

該實現方案與 Objective-C / Cocoa 的字符串可變性有所不同,后者是通過在實例所屬的兩個類中二選一(NSStringNSMutableString)來聲明字符串是否可變。

 

String屬于傳值類型

Swift 的 String 類型是一種傳值類型value type。如果將一個 String 值傳遞給一個函數或方法,或將其賦值給一個常量或變量,則該 String 值也會被一同復制copied過去。這兩種情況均會為現有 String 值創建新的副本,實際傳遞或賦值的是其副本,而非其原始實例。傳值類型的說明請見 結構與枚舉類型均為傳值類型 (后面章節譯到)。

注:

該行為與 CocoaNSString 不同。Cocoa 中創建 NSString 實例并傳遞給函數或方法,或賦值給變量時,實際傳遞或賦值的是同一個 NSString 實例的引用(reference,非復制--copy)。這中間不會有復制字符串的操作,除非特別指定。

Swift 中 String 的 “默認復制” 行為可確保函數或方法傳遞 String 值給你時,這個 String 值的確屬于你,而與其出處無關??梢钥隙ǖ氖?,除非你自己去修改它,你接收到的字符串絕對不會變。

在后臺,Swift 的編譯器會優化字符串的內存占用,僅在絕對需要時才會實際創建字符串的副本。因此,字符串屬于傳值類型讓你的代碼總能達到最佳性能。

 

字符操作

Swift中的 String 類型是一段 Character 值的有序集合,每一個 Character 值代表一個 Unicode 字符。你可以通過 for-in 循環遍歷訪問一個字符串中的每個 Character 值:

1 for character in "Dog!" {2     println(character)  //輸出(character)3 }4 // D5 // o6 // g7 // !8 // 

For-in 的用法后面在流程控制一章會譯到。

另外,通過 Character 類型說明可以從單字符的字符串字面量中單獨創建字符常量或變量:

1 let yenSign: Character = "¥"2 // 指定了yenSign為 Character 類型 -- Joe.Huang

 

字符統計

可以使用全局方法 countElements 來統計字符串中字符的個數,把字符串作為唯一的參數傳進即可:

1 let unusualMenagerie = "Koala , Snail , Penguin , Dromedary "2 println("unusualMenagerie has /(countElements(unusualMenagerie)) characters")3 // 輸出 "unusualMenagerie 有 40 個字符"

注:

不同的 Unicode 字符,以及同一個 Unicode 字符的不同表示,在內存中所占用的存儲空間不同。因此,要想計算出字符串的長度,必須遍歷整個字符串,依次統計每一個字符。如果你在處理特別長的字符串值,要謹記,countElements 函數需要遍歷字符串中的每個字符方能求出其精確的字符個數。

還要注意的一點是,countElements 返回的字符個數,與包含同樣字符的 NSString 對象的 length 屬性所返回的字符個數并不總是一樣多。NSString 的長度根據該字符串的 UTF-16 形式的 16 位碼單元個數得出,而非根據字符串內 Unicode 字符的個數得出。為了區別體現這一事實,在 Swift 語言中,NSStringlength 屬性需通過 String 值的 utf16count 屬性訪問。

 

字符串與字符的拼接

StringCharacter 值可以用加法運算符(+)加在一起(即連接concatenate),得到一個新的 String 值:

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

(接上例的常量)還可以用加法賦值運算符(+=)在 String 變量的末尾追加(append) String 或 Character

var instruction = "look over"instruction += string2// instruction now equals "look over there"// instruction 現在等于 "瞧那兒" var welcome = "good morning"welcome += character1// welcome now equals "good morning!"// welcome 現在等于 "早上好!"

 

字符串插入

字符串插入是一種將常量,變量,字面量,表達式混合插入字符串字面量并得到一個新的 String 值的方法。字符串字面量中插入的每一項均需用一對括號包圍,并前置反斜杠:

1 let multiplier = 32 let message = "/(multiplier) times 2.5 is /(Double(multiplier) * 2.5)"3 // message is "3 times 2.5 is 7.5"4 // message 是 "3 乘以 2.5 是 7.5"

在上例中, 常量 multiplier 的值以 /(multiplier) 的形式作為占位符插入字符串字面量中。在根據字符串插入式求出實際字符串的過程中,占位符會被 multiplier 的實際值替換。

后面一個較長的表達式用到了 multiplier 的值。該表達式計算了 Double(multiplier) * 2.5 的值,并將結果7.5)插入了字符串。上例中, /(Double(multiplier) * 2.5) 作為占位符嵌入了字符串字面量中。

注:

字符串插入中,括號里面的表達式不能包含未轉義的雙引號(")或反斜杠(/),也不能包含回車或換行符。

 

字符串比較

Swift 提供了三種字符串比較方法:字符串匹配,前綴匹配,后綴匹配。

 

字符串匹配

如果兩個 String 值所包含的字符及其順序完全相同,兩者即相等:

1 let quotation = "We're a lot alike, you and I."2 let sameQuotation = "We're a lot alike, you and I."3 if quotation == sameQuotation {4     println("These two strings are considered equal")5 }6 // 輸出 "這兩個字符串是相等的"

 

前綴/后綴匹配

檢查一個字符串是否含有一個指定的字符前綴或后綴,可以使用字符串的 hasprefixhasSuffix 方法,兩種方法都接收一個 String 類型的參數并返回一個布爾值。這兩種方法會拿前綴/后綴字符串與基本字符串一個字符一個字符地逐一比較。

下例有一個字符串數組,內容為莎士比亞戲劇《羅密歐與朱麗葉》(Romeo and Juliet)前兩幕各場景的地點說明

 1 let romeoAndJuliet = [ 2     "Act 1 Scene 1: Verona, A public place",               //第一幕場景1:Verona,一個公共場所 3     "Act 1 Scene 2: Capulet's mansion",                    //第一幕場景2:Capulet的家 4     "Act 1 Scene 3: A room in Capulet's mansion",          //第一幕場景3:Capulet家的一間房內 5     "Act 1 Scene 4: A street outside Capulet's mansion",   //第一幕場景4:Capulet家外的街上 6     "Act 1 Scene 5: The Great Hall in Capulet's mansion",  //第一幕場景5:Capulet家的大廳內 7     "Act 2 Scene 1: Outside Capulet's mansion",            //第二幕場景1:Capulet家外面 8     "Act 2 Scene 2: Capulet's orchard",                    //第二幕場景2:Capulet的果園 9     "Act 2 Scene 3: Outside Friar Lawrence's cell",        //第二幕場景3:Friar Lawrence神父的教堂外10     "Act 2 Scene 4: A street in Verona",                   //第二幕場景4:Verona的某條街道上11     "Act 2 Scene 5: Capulet's mansion",                    //第二幕場景5:Capulet的家12     "Act 2 Scene 6: Friar Lawrence's cell"                 //第二幕場景6:Friar Lawrence神父的教堂13 ]

romeoAndJuliet 數組中的元素使用 hasPrefix 方法,來統計該劇第一幕(Act 1)的場次:

1 var act1SceneCount = 02 for scene in romeoAndJuliet {3     if scene.hasPrefix("Act 1 ") {4         ++act1SceneCount5     }6 }7 println("There are /(act1SceneCount) scenes in Act 1")8 // 輸出 "Act 1(第一幕) 有5場戲"

同樣,用 hasSuffix 方法來統計發生在 Capulet’s mansion 和 Friar Lawrence’s cell 這些地點的場次:

 1 var mansionCount = 0 2 var cellCount = 0 3 for scene in romeoAndJuliet { 4     if scene.hasSuffix("Capulet's mansion") { 5         ++mansionCount 6     } else if scene.hasSuffix("Friar Lawrence's cell") { 7         ++cellCount 8     } 9 }10 println("/(mansionCount) mansion scenes; /(cellCount) cell scenes")11 // 輸出 "mansion 6場; cell 2場"

 

 

謝謝,Swifter-QQ群:362232993,同好者進~ 

Fork:https://github.com/Joejo/Swift-lesson-for-chinese

 

 

 

 

 

 

 

 

 

 

 

 

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品成人国产在线观看男人呻吟| 精品调教chinesegay| 这里只有精品久久| 精品一区二区三区三区| 亚洲日韩欧美视频一区| 亚洲国产精品悠悠久久琪琪| 亚洲第一区第一页| 久久久午夜视频| 久久久久九九九九| 日韩电影免费观看中文字幕| 国产精品揄拍500视频| 九九九久久国产免费| 91久久在线视频| 亚洲人成五月天| 亚洲一区二区三区视频| 亚洲精品www久久久久久广东| 国产美女精品免费电影| 国产欧美欧洲在线观看| 黄色一区二区在线| 91九色国产社区在线观看| 国产日韩欧美黄色| 91久久精品久久国产性色也91| 国产精品久久久久久搜索| 精品美女久久久久久免费| 亚洲午夜未删减在线观看| 国产精品中文字幕久久久| 日韩av片电影专区| 欧美另类在线观看| 成人午夜激情网| 欧美高清不卡在线| 国产精品69精品一区二区三区| 精品中文字幕在线2019| 黑人巨大精品欧美一区二区三区| 456国产精品| 欧美日韩不卡合集视频| 国产欧美日韩视频| 伊人久久久久久久久久| 欧美日韩一区二区免费在线观看| 日韩电影视频免费| 在线看欧美日韩| 中文字幕日韩免费视频| 欧美亚洲成人免费| 日韩精品一区二区三区第95| 亚洲日本欧美中文幕| 一本色道久久综合狠狠躁篇怎么玩| 亚洲最大福利网站| 久久久久久久久久久亚洲| 欧美视频精品一区| 亚洲成人999| 懂色av中文一区二区三区天美| 91精品视频大全| 91中文字幕在线| 亚洲国产成人久久综合一区| 亚洲美女激情视频| 日韩大陆欧美高清视频区| 亚洲第一区在线观看| 国产精品爽爽爽爽爽爽在线观看| 欧美日韩亚洲精品一区二区三区| 亚洲精品有码在线| 国产欧美精品va在线观看| 97avcom| 亚洲综合日韩中文字幕v在线| 97视频人免费观看| 亚洲一区二区三区xxx视频| 欧美极品少妇xxxxⅹ裸体艺术| xvideos成人免费中文版| 日韩精品一区二区视频| 欧美丰满少妇xxxxx| 精品欧美激情精品一区| 日本精品免费观看| 久久免费成人精品视频| 51精品国产黑色丝袜高跟鞋| 亚洲欧美国产视频| 亚洲成年网站在线观看| 国内揄拍国内精品少妇国语| 欧美成人h版在线观看| 国产欧美欧洲在线观看| 91精品美女在线| 美日韩在线视频| 中文字幕亚洲自拍| 亚洲人成在线电影| 久久久免费av| 精品国产欧美一区二区五十路| 欧美贵妇videos办公室| 国产精品久久久久久亚洲调教| 91超碰中文字幕久久精品| 欧美性xxxx极品hd欧美风情| 日韩亚洲欧美中文在线| 欧美综合在线第二页| 中文字幕视频一区二区在线有码| 亚洲一区二区日本| 欧美成人精品三级在线观看| 亚洲丝袜一区在线| 91av福利视频| 97碰在线观看| 在线观看日韩专区| 成人羞羞国产免费| 国产91精品久| 日韩欧美在线免费| 久久久国产视频91| 国产在线日韩在线| 精品magnet| 日韩欧美亚洲综合| 国产亚洲精品久久| 夜夜嗨av一区二区三区免费区| 久久久久久欧美| 国产美女91呻吟求| 精品丝袜一区二区三区| 日韩欧美在线视频免费观看| 91av在线播放| 久久久久久久亚洲精品| 青草青草久热精品视频在线网站| 精品国产乱码久久久久久婷婷| 亚洲精品小视频| 亚洲精品自拍视频| 日韩精品中文在线观看| 日韩精品视频三区| 精品国产视频在线| 日韩欧美亚洲一二三区| 欧美精品久久久久| 欧美又大又粗又长| 国产精品日韩在线| 羞羞色国产精品| 69av成年福利视频| 欧美成人午夜免费视在线看片| 国产精国产精品| 亚洲国产中文字幕在线观看| 国产精品永久免费视频| 青青精品视频播放| 国产aaa精品| 精品久久久久久电影| 亚洲欧美制服另类日韩| 亚洲精品久久视频| 欧美成人免费在线视频| 精品国产精品自拍| 亚洲精品美女久久久久| 久99九色视频在线观看| 成人福利网站在线观看| 日韩中文在线中文网在线观看| 欧美日韩成人精品| 日韩视频在线免费观看| 午夜精品久久久99热福利| 亚洲激情在线观看视频免费| 日韩欧美福利视频| 久久久久久91香蕉国产| 久久成人免费视频| 国产91热爆ts人妖在线| 国产一区深夜福利| 亚洲精品成人久久| 亚洲欧美日韩第一区| 国产精品久久久久久久久久新婚| 亚洲精品在线观看www| 亚洲视频第一页| 欧美成年人在线观看| 97在线视频免费| 国产精品扒开腿爽爽爽视频| 91精品国产精品| 亚洲欧洲在线视频| 亚洲色图国产精品| 久久精品国产99国产精品澳门| 亚洲成人av资源网| 亚洲性av网站| 久久九九国产精品怡红院| 国产精品视频区|