swift簡(jiǎn)單總結(jié)(十一)—— 字符串和字符

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.07.24

前言

我是swift2.0的時(shí)候開(kāi)始接觸的,記得那時(shí)候還不是很穩(wěn)定者铜,公司的項(xiàng)目也都是用oc做的腔丧,并不對(duì)swift很重視,我自己學(xué)了一段時(shí)間作烟,到現(xiàn)在swift3.0+已經(jīng)出來(lái)了愉粤,自己平時(shí)也不寫,忘記的也差不多了拿撩,正好項(xiàng)目這段時(shí)間已經(jīng)上線了衣厘,不是很忙,我就可以每天總結(jié)一點(diǎn)了,希望對(duì)自己對(duì)大家有所幫助影暴。在總結(jié)的時(shí)候我會(huì)對(duì)比oc進(jìn)行說(shuō)明错邦,有代碼的我會(huì)給出相關(guān)比對(duì)代碼。
1. swift簡(jiǎn)單總結(jié)(一)—— 數(shù)據(jù)簡(jiǎn)單值和類型轉(zhuǎn)換
2. swift簡(jiǎn)單總結(jié)(二)—— 簡(jiǎn)單值和控制流
3. swift簡(jiǎn)單總結(jié)(三)—— 循環(huán)控制和函數(shù)
4. swift簡(jiǎn)單總結(jié)(四)—— 函數(shù)和類
5. swift簡(jiǎn)單總結(jié)(五)—— 枚舉和結(jié)構(gòu)體
6. swift簡(jiǎn)單總結(jié)(六)—— 協(xié)議擴(kuò)展與泛型
7. swift簡(jiǎn)單總結(jié)(七)—— 數(shù)據(jù)類型
8. swift簡(jiǎn)單總結(jié)(八)—— 別名型宙、布爾值與元組
9. swift簡(jiǎn)單總結(jié)(九)—— 可選值和斷言
10. swift簡(jiǎn)單總結(jié)(十)—— 運(yùn)算符

字符串字面量 String Literals

swift中的字符串類型為String撬呢,與Foundation NSString類進(jìn)行了無(wú)縫橋接,如果您利用CocoaCocoa Touch中的Foundation框架進(jìn)行工作妆兑,所有NSString API都可以調(diào)用您創(chuàng)建的任意String類型的值魂拦。

字符串的字面量很好定義,就是用雙引號(hào)""即可搁嗓。與oc不同的是芯勘,oc中要求在字符串前面用@

所以谱姓,oc中的這么定義的借尿。

NSString *nickName =  @"John"

而在swift中是這么定義的。

let nickName = "John"

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

  • 轉(zhuǎn)義字符\0(空字符)屉来、\\\(反斜線)路翻、\t(水平制表符)\n(換行符)茄靠、\r(回車符)茂契、\"(雙引號(hào))\'(單引號(hào))慨绳。
  • Unicode標(biāo)量掉冶,寫成\u{n}u為小寫字母脐雪,其中n為任意的一到八位十六進(jìn)制數(shù)厌小。

下面看下面的例子。

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)")

下面看一下輸出結(jié)果

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


初始化空字符串 Initializing an Empty String

無(wú)論是oc還是swift中都可以創(chuàng)建一個(gè)空的字符串以方便以后的使用战秋。

下面我們看一下oc中的空字符串的創(chuàng)建璧亚。

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

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

下面看輸出結(jié)果

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)")

下面我們看一下輸出結(jié)果

emptyStr = 
emptyStr1 = 

字符串可變性 String Mutablility

swift中的可變字符串的定義只需要定義為var就可以脂信,和oc不同癣蟋,oc中可變字符串有一個(gè)對(duì)應(yīng)的類NSMutableString,只有這個(gè)可變對(duì)象才可以改變字符串內(nèi)部存儲(chǔ)的內(nèi)容狰闪。

下面我們看一下oc中可變字符串的實(shí)例化以及值的改變疯搅。

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

下面看輸出結(jié)果

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

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

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

下面看輸出結(jié)果

varStr = boy  girl

大家可以看見(jiàn)埋泵,相對(duì)來(lái)說(shuō)幔欧,swift更簡(jiǎn)潔。


字符串是值類型 Strings Are Value Types

swiftString類型是值類型,如果你創(chuàng)建一個(gè)新的字符串琐馆,那么當(dāng)其進(jìn)行常量规阀、變量賦值操作或在函數(shù)/方法中傳遞時(shí),會(huì)進(jìn)行值拷貝瘦麸,任何情況下谁撼,都會(huì)對(duì)已有字符串值創(chuàng)建新副本,并對(duì)該新副本進(jìn)行傳遞或賦值操作滋饲。

注意:與Cocoa中的NSString不同的是厉碟,當(dāng)在Cocoa中創(chuàng)建一個(gè)NSString實(shí)例,并將其傳遞給一個(gè)函數(shù)/方法屠缭,或者賦值給一個(gè)變量箍鼓,您傳遞或賦值的是該NSString實(shí)例的引用,除非根據(jù)特別要求進(jìn)行值拷貝呵曹,否則字符串不會(huì)生成新的副本進(jìn)行賦值操作款咖。


使用字符 working with Characters

swiftString類型表示特定序列的Character類型值得集合,每一個(gè)字符值代表一個(gè)Unicode字符奄喂,下面我們看一個(gè)例子铐殃。

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

這么寫以前是對(duì)的,但是后來(lái)更改了跨新,如果這么寫打印自符會(huì)報(bào)下面的錯(cuò)誤信息富腊。

type string does not conform to protocol

下面就是解決方法

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

下面看輸出結(jié)果。

b
o
y
s
!

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

//字符串打印字符
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);
}];

下面看輸出結(jié)果

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


計(jì)算字符數(shù)量 Counting Characters

swift中通過(guò)調(diào)用全局``函數(shù)赘被,可以獲取該字符串的字符數(shù)量。

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

下面看輸出結(jié)果

19

不過(guò)還要注意:

  • 不同的Unicode字符以及相同的Unicode字符的不同表達(dá)方式可能需要不同數(shù)量的內(nèi)存空間類存儲(chǔ)肖揣,所以民假,swift中的字符在一個(gè)字符串中并不一定占有相同的內(nèi)存空間,因此字符串的長(zhǎng)度不得不通過(guò)迭代字符串中每一個(gè)字符的長(zhǎng)度來(lái)計(jì)算龙优。
  • 不同于oc中的NSString阳欲,NSString中的length屬性是基于UTF-16表示的十六位代碼單元數(shù)字,而不是基于Unicode字符陋率。為了解決這個(gè)問(wèn)題,NSStringlength屬性被swift中的utf16來(lái)替換秽晚。

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

關(guān)于字符串和字符的合并其實(shí)前面已經(jīng)說(shuō)過(guò)了瓦糟,這里就簡(jiǎn)單的舉幾個(gè)例子。

//字符串的合并
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)")

下面看輸出結(jié)果

str = helloworld
strValue = helloworld
strValue1 = hello!

注意:不能將一個(gè)字符串或者字符添加到一個(gè)已知存在的字符變量上赴蝇,因?yàn)樽址兞恐荒馨粋€(gè)字符菩浙。


字符串插值 String Interpolation

剛說(shuō)這個(gè)概念,大家可能不知道啥意思,其實(shí)前面已經(jīng)用到了劲蜻,字符串插值是一種構(gòu)建新字符串的方式陆淀,可以包含常量變量先嬉、字面量表達(dá)式轧苫,插入的字符串字面量每一項(xiàng)都要包裹在以反斜線為前綴的圓括號(hào)中,看下面例子疫蔓。

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

下面看輸出結(jié)果

value = 3 乘以 2.5 是 7.5

注意:插值字符串中寫在括號(hào)中的表達(dá)式不能包含非轉(zhuǎn)義雙引號(hào)"和反斜杠\含懊。并且不能包含回車和換行符。


前綴/后綴相等 Prefix and Suffix Equality

oc中相同衅胀,swift中也有判斷字符串是否包含某個(gè)前綴或者后綴岔乔,返回的是一個(gè)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");
}

下面看輸出結(jié)果

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")
}

下面看輸出結(jié)果

YES
YES


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

swiftoc中都有大小寫字母的轉(zhuǎn)換,下面我們先看一下oc中的大小寫轉(zhuǎn)換掸掏。

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

下面看輸出結(jié)果

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中的大小寫轉(zhuǎn)換茁影。

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

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

下面看輸出結(jié)果

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


Unicode

相信大家對(duì)這個(gè)并不陌生,Unicode是國(guó)際標(biāo)準(zhǔn)阅束,用于文本的編碼和表示呼胚,它使您可以用標(biāo)準(zhǔn)格式表示來(lái)自任意語(yǔ)言幾乎所有的字符,并能夠?qū)ξ谋净蚓W(wǎng)頁(yè)這樣的外部資源中的字符進(jìn)行讀寫操作息裸。swift中的字符串和字符類型是完全兼容Unicode標(biāo)準(zhǔn)的蝇更。

1. Unicode術(shù)語(yǔ) Unicode Terminology

Unicode中每一個(gè)字符都可以被解釋為一個(gè)或者多個(gè)unicode標(biāo)量,字符的unicode標(biāo)量是一個(gè)唯一的21位數(shù)字(和名稱)呼盆,例如U+0061表示小寫的拉丁字母A("a")年扩。當(dāng)unicode字符串被寫進(jìn)文本文件或其他存儲(chǔ)結(jié)構(gòu)當(dāng)中,這些unicode標(biāo)量將會(huì)按照Unicode定義的集中格式之一進(jìn)行編碼访圃,包括UTF-8(以8位代碼單元進(jìn)行編碼)UTF-16(以16位代碼單元進(jìn)行編碼)厨幻。

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

swift提供了幾種不同的方式來(lái)訪問(wèn)字符串的Unicode表示。

您可以使用for - in來(lái)對(duì)字符串進(jìn)行遍歷腿时,從而以Unicode字符的方式訪問(wèn)每一個(gè)字符值况脆,另外,能夠以其他三種Unicode兼容的方式訪問(wèn)字符串的值批糟。

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

3. UTF-8

可以通過(guò)遍歷字符串的utf8屬性來(lái)訪問(wèn)它的UTF-8表示格了,其類型為UTF8View,是無(wú)符號(hào)的8位值得集合徽鼎,每一個(gè)UInt8值都是一個(gè)字符的UTF-8表示盛末。

    public var utf8: String.UTF8View

下面看代碼

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

下面看輸出結(jié)果

100

111

103

33

上面輸出的四個(gè)值就代表了字符串dog!中每個(gè)字符弹惦。

4. UTF-16

可以通過(guò)遍歷字符串的utf16屬性來(lái)訪問(wèn)它的UTF-16表示,其類型為UTF16View悄但,是無(wú)符號(hào)的16位值得集合棠隐,每一個(gè)UInt16值都是一個(gè)字符的UTF-16表示。

下面還是看代碼檐嚣。

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

下面看輸出結(jié)果

100

111

103

33

可見(jiàn)助泽,這幾個(gè)數(shù)字沒(méi)有變化,它們的UTF-16代碼單元和UTF-8完全相同净嘀。

5. Unicode標(biāo)量 Unicode Scalars

可以遍歷字符串的unicodeScalars屬性訪問(wèn)它的Unicode標(biāo)量表示报咳,其為UnicodeScalarView類型的屬性,如下所示:

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

UnicodeScalarViewunicodeScalar的集合挖藏,unicodeScalar是21位的Unicode代碼點(diǎn)暑刃,每一個(gè)unicodeScalar擁有一個(gè)值屬性,可以返回對(duì)應(yīng)的21位數(shù)值膜眠,用UInt32來(lái)表示岩臣。

下面我們看代碼。

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

下面看輸出結(jié)果

100

111

103

33


后記

未完宵膨,待續(xù)~~~~

少司命
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末架谎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辟躏,更是在濱河造成了極大的恐慌谷扣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捎琐,死亡現(xiàn)場(chǎng)離奇詭異会涎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瑞凑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門末秃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人籽御,你說(shuō)我怎么就攤上這事练慕×褰” “怎么了劲阎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵哪工,是天一觀的道長(zhǎng)雁比。 經(jīng)常有香客問(wèn)我偎捎,道長(zhǎng)茴她,這世上最難降的妖魔是什么丈牢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任己沛,我火速辦了婚禮申尼,結(jié)果婚禮上垫桂,老公的妹妹穿的比我還像新娘。我一直安慰自己霹粥,他們只是感情好碱呼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布忆蚀。 她就那樣靜靜地躺著姑裂,像睡著了一般欣鳖。 火紅的嫁衣襯著肌膚如雪泽台。 梳的紋絲不亂的頭發(fā)上怀酷,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天桅锄,我揣著相機(jī)與錄音样眠,去河邊找鬼。 笑死檐束,一個(gè)胖子當(dāng)著我的面吹牛辫秧,可吹牛的內(nèi)容都是我干的厢塘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晚碾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了格嘁?” 一聲冷哼從身側(cè)響起笛求,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糕簿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體懂诗,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殃恒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年病附,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亥鬓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嵌戈。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡覆积,死狀恐怖听皿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宽档,我是刑警寧澤写穴,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站雌贱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏偿短。R本人自食惡果不足惜欣孤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昔逗。 院中可真熱鬧降传,春花似錦、人聲如沸勾怒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)笔链。三九已至段只,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鉴扫,已是汗流浹背赞枕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坪创,地道東北人炕婶。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像莱预,于是被迫代替她去往敵國(guó)和親柠掂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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