swift簡單總結(十一)—— 字符串和字符

版本記錄

版本號 時間
V1.0 2017.07.24

前言

我是swift2.0的時候開始接觸的,記得那時候還不是很穩定,公司的項目也都是用oc做的,并不對swift很重視,我自己學了一段時間,到現在swift3.0+已經出來了,自己平時也不寫,忘記的也差不多了,正好項目這段時間已經上線了,不是很忙,我就可以每天總結一點了,希望對自己對大家有所幫助。在總結的時候我會對比oc進行說明,有代碼的我會給出相關比對代碼。
1. swift簡單總結(一)—— 數據簡單值和類型轉換
2. swift簡單總結(二)—— 簡單值和控制流
3. swift簡單總結(三)—— 循環控制和函數
4. swift簡單總結(四)—— 函數和類
5. swift簡單總結(五)—— 枚舉和結構體
6. swift簡單總結(六)—— 協議擴展與泛型
7. swift簡單總結(七)—— 數據類型
8. swift簡單總結(八)—— 別名、布爾值與元組
9. swift簡單總結(九)—— 可選值和斷言
10. swift簡單總結(十)—— 運算符

字符串字面量 String Literals

swift中的字符串類型為String,與Foundation NSString類進行了無縫橋接,如果您利用CocoaCocoa Touch中的Foundation框架進行工作,所有NSString API都可以調用您創建的任意String類型的值。

字符串的字面量很好定義,就是用雙引號""即可。與oc不同的是,oc中要求在字符串前面用@

所以,oc中的這么定義的。

NSString *nickName =  @"John"

而在swift中是這么定義的。

let nickName = "John"

字符串字面量可以包含以下特殊字符:

  • 轉義字符\0(空字符)\\\(反斜線)\t(水平制表符)\n(換行符)\r(回車符)\"(雙引號)\'(單引號)
  • Unicode標量,寫成\u{n}u為小寫字母,其中n為任意的一到八位十六進制數。

下面看下面的例子。

let words = "\"我是齊天大圣\" - 孫悟空"
print("words = \(words)")

let dollarSign = "\u{24}"
print("dollarSign = \(dollarSign)")

let blackHeart = "\u{2665}"
print("blackHeart = \(blackHeart)")

let sparklingHeart = "\u{1F496}"
print("sparklingHeart = \(sparklingHeart)")

下面看一下輸出結果

words = "我是齊天大圣" - 孫悟空
dollarSign = $
blackHeart = ?
sparklingHeart = ??


初始化空字符串 Initializing an Empty String

無論是oc還是swift中都可以創建一個空的字符串以方便以后的使用。

下面我們看一下oc中的空字符串的創建。

NSString *emptyStr = @"";
NSLog(@"emptyStr = %@",emptyStr);

NSString *emptyStr1 = [NSString string];
NSLog(@"emptyStr1 = %@",emptyStr1);

下面看輸出結果

2017-07-24 13:43:06.926378+0800 JJOC[4972:1544869] emptyStr =
2017-07-24 13:43:06.926427+0800 JJOC[4972:1544869] emptyStr1 =

下面我們看一下swift中的空字符串的初始化。

//空字符串的初始化
var emptyStr = ""
print("emptyStr = \(emptyStr)")

var emptyStr1 = String()
print("emptyStr1 = \(emptyStr1)")

下面我們看一下輸出結果

emptyStr = 
emptyStr1 = 

字符串可變性 String Mutablility

swift中的可變字符串的定義只需要定義為var就可以,和oc不同,oc中可變字符串有一個對應的類NSMutableString,只有這個可變對象才可以改變字符串內部存儲的內容。

下面我們看一下oc中可變字符串的實例化以及值的改變。

//可變字符串
NSMutableString *strM = [NSMutableString string];
[strM appendString:@"boy "];
[strM appendString:@" girl"];
NSLog(@"strM = %@",strM);

下面看輸出結果

2017-07-24 13:51:33.513696+0800 JJOC[4982:1546598] strM = boy  girl

下面我們看一下swift中的可變字符串的初始化和賦值。

//可變字符串的初始化
var varStr = "boy "
varStr += " girl"
print("varStr = \(varStr)")

下面看輸出結果

varStr = boy  girl

大家可以看見,相對來說,swift更簡潔。


字符串是值類型 Strings Are Value Types

swiftString類型是值類型,如果你創建一個新的字符串,那么當其進行常量、變量賦值操作或在函數/方法中傳遞時,會進行值拷貝,任何情況下,都會對已有字符串值創建新副本,并對該新副本進行傳遞或賦值操作。

注意:與Cocoa中的NSString不同的是,當在Cocoa中創建一個NSString實例,并將其傳遞給一個函數/方法,或者賦值給一個變量,您傳遞或賦值的是該NSString實例的引用,除非根據特別要求進行值拷貝,否則字符串不會生成新的副本進行賦值操作。


使用字符 working with Characters

swiftString類型表示特定序列的Character類型值得集合,每一個字符值代表一個Unicode字符,下面我們看一個例子。

//字符量
for character in "boys!" {
    print(character)
}

這么寫以前是對的,但是后來更改了,如果這么寫打印自符會報下面的錯誤信息。

type string does not conform to protocol

下面就是解決方法

//字符量
for character in "boys!".characters {
    print(character)
}

下面看輸出結果。

b
o
y
s
!

下面我們可以看一下oc中打印逐個字符或者子字符串的方法。

//字符串打印字符
NSString *str = @"boys!";
[str enumerateSubstringsInRange:NSMakeRange(0, str.length) options:NSStringEnumerationByLines usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
    NSLog(@"substring = %@",substring);
}];

下面看輸出結果

2017-07-24 14:12:56.825189+0800 JJOC[4996:1549859] substring = boys!


計算字符數量 Counting Characters

swift中通過調用全局``函數,可以獲取該字符串的字符數量。

//字符數量的計算
let str = "you are a good girl"
let length = str.characters.count
print(length)

下面看輸出結果

19

不過還要注意:

  • 不同的Unicode字符以及相同的Unicode字符的不同表達方式可能需要不同數量的內存空間類存儲,所以,swift中的字符在一個字符串中并不一定占有相同的內存空間,因此字符串的長度不得不通過迭代字符串中每一個字符的長度來計算。
  • 不同于oc中的NSString,NSString中的length屬性是基于UTF-16表示的十六位代碼單元數字,而不是基于Unicode字符。為了解決這個問題,NSStringlength屬性被swift中的utf16來替換。

連接字符串和字符 Concatenating Strings and Characters

關于字符串和字符的合并其實前面已經說過了,這里就簡單的舉幾個例子。

//字符串的合并
let str1 = "hello"
let str2 = "world"
var str  = str1 + str2
print("str = \(str)")

var strValue  = str1.appending(str2)
print("strValue = \(strValue)")

var strValue1  = str1.appending("!")
print("strValue1 = \(strValue1)")

下面看輸出結果

str = helloworld
strValue = helloworld
strValue1 = hello!

注意:不能將一個字符串或者字符添加到一個已知存在的字符變量上,因為字符變量只能包含一個字符。


字符串插值 String Interpolation

剛說這個概念,大家可能不知道啥意思,其實前面已經用到了,字符串插值是一種構建新字符串的方式,可以包含常量變量字面量表達式,插入的字符串字面量每一項都要包裹在以反斜線為前綴的圓括號中,看下面例子。

//插值的計算
let factor = 3
let value = "\(factor) 乘以 2.5 是 \(Double(factor) * 2.5)"
print("value = \(value)")

下面看輸出結果

value = 3 乘以 2.5 是 7.5

注意:插值字符串中寫在括號中的表達式不能包含非轉義雙引號"和反斜杠\。并且不能包含回車和換行符。


前綴/后綴相等 Prefix and Suffix Equality

oc中相同,swift中也有判斷字符串是否包含某個前綴或者后綴,返回的是一個Boolean值。

我們先看一下oc中的代碼舉例。

//判斷前綴和后綴
NSString *str = @"I am in Beijing City";
if ([str hasPrefix:@"I"]) {
    NSLog(@"YES");
}
else{
    NSLog(@"NO");
}

if ([str hasSuffix:@"City"]) {
    NSLog(@"YES");
}
else {
    NSLog(@"NO");
}

下面看輸出結果

2017-07-24 14:56:59.477915+0800 JJOC[5011:1555116] YES
2017-07-24 14:56:59.477963+0800 JJOC[5011:1555116] YES

接著我們就看swift中的情況。

//前綴和后綴的判斷
let str = "I am in Beijing City"
if str.hasPrefix("I"){
    print("YES")
}
else{
    print("NO")
}

if str.hasSuffix("City"){
    print("YES")
}
else {
    print("NO")
}

下面看輸出結果

YES
YES


大寫和小寫字符串 Uppercase and Lowercase Strings

swiftoc中都有大小寫字母的轉換,下面我們先看一下oc中的大小寫轉換。

    //大小寫字母的轉化
    NSString *str = @"I am not a salted fish";
    NSString *str1 = str.uppercaseString;
    NSLog(@"%@",str1);
    
    NSString *str2 = str.lowercaseString;
    NSLog(@"%@",str2);

下面看輸出結果

2017-07-24 15:11:12.780687+0800 JJOC[5017:1556643] I AM NOT A SALTED FISH
2017-07-24 15:11:12.780747+0800 JJOC[5017:1556643] i am not a salted fish

下面我們就接著看swift中的大小寫轉換。

    //大小寫的轉換
    let str = "I am not a salted fish"
    let str1 = str.uppercased()
    print(str1)

    let str2 = str.lowercased();
    print(str2)

下面看輸出結果

I AM NOT A SALTED FISH
i am not a salted fish


Unicode

相信大家對這個并不陌生,Unicode是國際標準,用于文本的編碼和表示,它使您可以用標準格式表示來自任意語言幾乎所有的字符,并能夠對文本或網頁這樣的外部資源中的字符進行讀寫操作。swift中的字符串和字符類型是完全兼容Unicode標準的。

1. Unicode術語 Unicode Terminology

Unicode中每一個字符都可以被解釋為一個或者多個unicode標量,字符的unicode標量是一個唯一的21位數字(和名稱),例如U+0061表示小寫的拉丁字母A("a")。當unicode字符串被寫進文本文件或其他存儲結構當中,這些unicode標量將會按照Unicode定義的集中格式之一進行編碼,包括UTF-8(以8位代碼單元進行編碼)UTF-16(以16位代碼單元進行編碼)

2. 字符串的Unicode表示 Unicode Representation of Strings

swift提供了幾種不同的方式來訪問字符串的Unicode表示。

您可以使用for - in來對字符串進行遍歷,從而以Unicode字符的方式訪問每一個字符值,另外,能夠以其他三種Unicode兼容的方式訪問字符串的值。

  • UTF-8 代碼單元集合(利用字符串的utf8屬性進行訪問)
  • UTF-16代碼單元集合(利用字符串的utf16屬性進行訪問)
  • 21位的Unicode標量值集合(利用字符串的unicodeScalars屬性進行訪問)

3. UTF-8

可以通過遍歷字符串的utf8屬性來訪問它的UTF-8表示,其類型為UTF8View,是無符號的8位值得集合,每一個UInt8值都是一個字符的UTF-8表示。

    public var utf8: String.UTF8View

下面看代碼

    //utf8
    let str = "dog!"
    for codeUnit in str.utf8 {
        print("\(codeUnit)\n")
    }

下面看輸出結果

100

111

103

33

上面輸出的四個值就代表了字符串dog!中每個字符。

4. UTF-16

可以通過遍歷字符串的utf16屬性來訪問它的UTF-16表示,其類型為UTF16View,是無符號的16位值得集合,每一個UInt16值都是一個字符的UTF-16表示。

下面還是看代碼。

    //utf16
    let str = "dog!"
    for codeUnit in str.utf16 {
        print("\(codeUnit)\n")
    }
        

下面看輸出結果

100

111

103

33

可見,這幾個數字沒有變化,它們的UTF-16代碼單元和UTF-8完全相同。

5. Unicode標量 Unicode Scalars

可以遍歷字符串的unicodeScalars屬性訪問它的Unicode標量表示,其為UnicodeScalarView類型的屬性,如下所示:

  /// The string's value represented as a collection of Unicode scalar values.
    public var unicodeScalars: String.UnicodeScalarView

UnicodeScalarViewunicodeScalar的集合,unicodeScalar是21位的Unicode代碼點,每一個unicodeScalar擁有一個值屬性,可以返回對應的21位數值,用UInt32來表示。

下面我們看代碼。

    let str = "dog!"
    for scalar in str.unicodeScalars {
        print("\(scalar)\n")
    }

下面看輸出結果

100

111

103

33


后記

未完,待續~~~~

少司命
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容