一個下午讓你掌握Swift基礎(chǔ) ( 4/9 ) 字符串

簡介

這是一個Swift語言教程,基于最新的iOS 9,Xcode 7.3和Swift 2.2,會為你介紹Swift編程非常基礎(chǔ)的內(nèi)容。從電腦如何工作的全程基本原理到語言結(jié)構(gòu),你會足夠了解這門語言,來處理數(shù)據(jù)和管理代碼的行為。

快速鏈接


數(shù)字是編程的基本要素,但他們不是你的apps里唯一需要的數(shù)據(jù)類型。文本(Text)也是一種非常常見的數(shù)據(jù)類型—人名;他們的地址;一本書的文字。這些都是app里可能需要用到文字的例子。

大部分電腦編程語言用一個叫做string的數(shù)據(jù)類型來存儲文字。這篇文章為你介紹strings(字符串),首先介紹一下字符串的背景概念,然后展示一下在Swift里怎么使用它們。

計算機(jī)如何表示字符串

電腦認(rèn)為字符串是單獨(dú)字符(characters)的集合(collection)。在這個教程的第一篇文章里,你知道了CPU的語言就是數(shù)字,并且所有代碼,不論是什么編程語言,最后都會變成數(shù)字。字符串也一樣!

聽起來可能很奇怪。字符怎么可以是數(shù)字呢?一臺最基本的計算機(jī)需要能夠把一個字符翻譯到計算機(jī)自己的語言,通過給每個字符分配一個不同的數(shù)字。這形成了一個雙向轉(zhuǎn)換,從字符到數(shù)字,叫做字符集(character set)

在你用鍵盤按下一個字符的按鍵的時候,實際上在用字符的數(shù)字和電腦交流。你的文字處理應(yīng)用程序把數(shù)字轉(zhuǎn)換到對應(yīng)字符的圖片,然后最終把圖片顯示給你。

Unicode

在電腦互相孤立的情況下,電腦可以隨便選擇用它喜歡的那個字符集來轉(zhuǎn)換。如果電腦想要字母 a 等于數(shù)字10,那就這樣咯。但當(dāng)計算機(jī)之間開始對話后,他們需要一個通用字符集。如果兩個電腦使用不同的字符集,然后一臺電腦傳輸一個字符串給另一個的時候,他們最終會認(rèn)為字符串包含了不同的字符。

所以,一個標(biāo)準(zhǔn)誕生了:Unicode。它定義了當(dāng)今幾乎所有電腦轉(zhuǎn)換字符集。

注意:你可以在官網(wǎng)上了解更多Unicode相關(guān),http:// unicode.org/

舉個例子,想想單詞 cafe。Unicode標(biāo)準(zhǔn)告訴我們這個單詞的字母應(yīng)該像這樣轉(zhuǎn)換到數(shù)字:

和每個字符對應(yīng)的數(shù)字叫做代碼點(diǎn)(code point)。所以在上面的例子里,c 使用代碼點(diǎn)99,a 使用代碼點(diǎn)97,以此類推。

當(dāng)然,Unicode不只有簡單的英語里的拉丁字符,比如 cafe。它也可以讓你從世界其他語言里轉(zhuǎn)換字符。

單詞cafe,你應(yīng)該也知道,它起源于法語,在法語里被寫作café。Unicode像這樣轉(zhuǎn)換字符:

這是用中文字符的例子:

你也聽過emoji吧,由小圖片組成,可以在文本里使用。這些圖片實際上就是普通的字符,也可以被Unicode轉(zhuǎn)換。例如:

這只是兩個字符。這些的代碼點(diǎn)數(shù)字都很大,但每個也只是單獨(dú)的代碼點(diǎn)。電腦認(rèn)為他們和其他任何兩個字符都沒有什么不同。

注意:“emoji”單詞來自日語,“e”表示圖片,“moji”表示字符。

Swift里的字符串

Swift,和任何優(yōu)秀的編程語言一樣,可以直接處理字符和字符串。通過數(shù)據(jù)類型Character和String來分別實現(xiàn)。這個教程里,你會學(xué)習(xí)有關(guān)這些數(shù)據(jù)類型以及如何使用它們。

字符和字符串

Character數(shù)據(jù)類型可以存儲一個單獨(dú)的字符。例如:

let charaterA: Charater = "a"

它存儲了字符 a。它可以保存任意字符——甚至是一個emoji:

let charaterDog: Character = "??"

但這個數(shù)據(jù)類型只被設(shè)計用來存儲單個字符。另一個String數(shù)據(jù)類型,用來存儲多個字符。例如:

let stringDog: String = "Dog"

就這么簡單!右邊的表達(dá)式被稱作字符串字面值(string literal),Swift的語法,用來表示一個字符串。

let stringDog = "Dog" // 這是一個String

串聯(lián)

你不止能創(chuàng)造簡單的字符串。有時候你需要串聯(lián)字符串,一個常規(guī)方式就是把它和另一個字符串組合起來。

Swift里,你可以相當(dāng)簡單地完成,使用加法操作符。就像你讓數(shù)字相加那樣,也可以讓字符串相加:

var message = "Hello" + "my name is "

let name = "Matt"
message += name // "Hello my name is Matt"

你需要聲明message為變量而不是常量,因為你想要修改它。你可以把字符串字面值加起來,就像第一行里,你也可以把字符串變量或常量加起來,就像最后一行。

把字符添加到字符串也是可能的。但是,Swift的類型嚴(yán)格意味著你在這么做的時候要顯示聲明,就像把Int和Double類型的數(shù)字加在一起的時候那么做。

要把一個字符加到字符串,你要這樣做:

let exclamationMark: Character = "!"
message += String(exclamationMark) // "Hello my name is Matt!"

顯示轉(zhuǎn)換Character到String的時候,要把這個代碼加到message之前。

插入

你也能用插入(interpolation)來創(chuàng)建一個字符串,這是一個特殊的Swift語法,允許你用一種容易讀的方式來建立字符串:

let name = "Matt"
let message = "Hello my name is \(name)!" // "Hello my name is Matt!"

我想你也會同意,這比之前部分的例子可讀性要強(qiáng)多了。這是字符串字面值語法的擴(kuò)展,你用其他值來替換字符串里指定的部分。把想給字符串的值用括號圍繞起來,前面再放一個反斜線。

從其他數(shù)據(jù)類型來創(chuàng)建字符串的語法也相同,比如數(shù)字:

let oneThird = 1.0 / 3.0
let oneThirdLongString = "One third is \(oneThird) as a decimal."

你在這兒的插入用了Double。在這行代碼的結(jié)尾,你的oneThirdLongString會包含如下:

One third is 0.3333333333333333 as a decimal.

當(dāng)然,它實際上會有無限個字符來用實數(shù)表示三分之一,因為它是一個循環(huán)小數(shù)。Double的字符串插入讓你沒有方式來控制結(jié)果字符串的精度。

這是使用字符串插入的一個不幸結(jié)果;使用起來很簡單,但沒有提供自定義輸出的能力。

相等和其他方法

有時候你想要判斷兩個字符串是否相等。例如,一個兒童游戲,命名照片里的動物,會需要判斷選手回答是否正確。

Swift里,你可以使用標(biāo)準(zhǔn)相等操作符來比較字符串,==,和比較數(shù)字的方式完全相同。例如:

let guess = "dog"
let dogEqualsCat = guess == "cat"

這里,dogEqualsCat是一個布爾型,這個情況中等于false,因為“dog”不等于“cat”。簡單!

和數(shù)字一樣,你不止能比較相等性,還能判斷一個值是大于或小于另一個值。例如:

let order = "cat" < "dog"

這個語法檢查一個字符串在字母表里是不是在另一個之前。這個情況中,order等于true,因為“cat”在“dog”前面。

相等的話題帶出了Unocide的一個有趣特色:有兩種方式表示一些字符。一個例子是 café 里的 é,帶有閉音符(acute accent)的 e。你可以用一個單獨(dú)的字符或兩個字符來表示它。

你在這篇文章之前看到了那個單獨(dú)的字符,代碼點(diǎn)233。雙字符例子是一個單獨(dú)的e,緊跟著一個閉音符組合字符(combining character),是一個特殊字符,可以修改前一個字符。

所以你可以通過這兩種方式來表示帶有一個閉音符的 e。

第二個示意圖里這兩個字符的組合被稱作字形簇(grapheme cluster)

組合字符的另一個例子是用來改變指定emojis的皮膚顏色的特殊字符。例如:

這里,emoji向上大拇指緊跟著一個皮膚色調(diào)的組合字符。在支持它的平臺上,包括iOS和Mac OS X,給出的emoji是一個單獨(dú)的圖像,向上大拇指字符但是應(yīng)用了皮膚色調(diào)。

組合字符讓字符串的相等性有一點(diǎn)棘手。例如,想想單詞 café 一個是用單獨(dú) é 字符寫的,一個使用了組合字符,像這樣:

這兩個字符串邏輯上當(dāng)然是相等的。當(dāng)他們被打印到屏幕上,看起來完全相同。但電腦內(nèi)部卻用了不同的方式表示。很多編程語言會認(rèn)為這些字符串不相等,因為這些語言一個接一個比較字符。

但是,Swift認(rèn)為這些字符串默認(rèn)是相等的。讓我們實際行動來看看:

let stringA = "café"
let stringB = "cafe\u{0301}"

let euqal = stringA == stringB

注意:在上面的代碼里,閉音符組合字符是用Unicode簡寫來寫的,用\u后面跟上十六進(jìn)制代碼點(diǎn),在花括號里。你可以用這個簡寫來寫任意Unicode字符。我在這兒必須要這樣做的原因是我沒有辦法在鍵盤上打出這個組合字符!

這個例子里,equal是true,因為兩個字符串邏輯上是相同的。

Swift里的字符串比較使用一個叫做標(biāo)準(zhǔn)化(canonicalization)的技術(shù)。快速把它的英文念三遍!在檢查相等之前,Swift會標(biāo)準(zhǔn)化兩個字符串,意味著他們被轉(zhuǎn)換到使用相同特殊字符表示。

無所謂用哪種方式完成標(biāo)準(zhǔn)化——用單獨(dú)字符還是用組合字符——兩個字符串已經(jīng)都被轉(zhuǎn)換到相同的形式了。一旦標(biāo)準(zhǔn)化完成了,Swift可以比較單獨(dú)的字符來檢測相等性。

在計算字符串里有多少字符的時候,標(biāo)準(zhǔn)化也發(fā)揮了同樣的作用。讓我們看看吧:

let stringA = "café"
let stringB = "cafe\u{0301}"

stringA.characters.count
stringB.characters.count

這段代碼的最后兩行得到了stringA和stringB的字符個數(shù)。

這是訪問一個對象的property的語法,這是你在這個教程里第一次看見它。但現(xiàn)在,你不需要理解任何事,只要知道這幾行能夠得到字符數(shù)量。

這里,字符數(shù)量都是4,即使第二個字符串是由五個代碼點(diǎn)組成的。 這是因為代碼計算他們會顯示在屏幕上的字符——其實就是計算字符簇的數(shù)量。

最后,Swift可以輕易創(chuàng)建大小和小寫字符串,很好用。像這樣做:

let string = "I can learn Swift basic in an afternoon!"

結(jié)果如下:

I CAN LEARN SWIFT BASIC IN AN AFTERNOON! i can learn swift basic in an afternoon!

再說一次,這句代碼使用了訪問字符串property的句法。你會在接下來的文章學(xué)習(xí)更多關(guān)于property的內(nèi)容。但現(xiàn)在,只要知道Swift里有很多方式來操作字符串。

迷你練習(xí)

  1. 創(chuàng)建一個字符串常量叫做firstName,然后用你的名字來初始化它。再創(chuàng)建一個字符串較量叫做lastName,初始化為你的姓。
  2. 創(chuàng)建一個字符串常量叫做fullName,通過把firstName和lastName常量加起來,中間空一格空格。
  3. 使用插入,創(chuàng)建一個字符串常量用fullName常量來創(chuàng)建一個字符串介紹一下你自己,叫做myDetails。例如,我的字符串會這么寫:“Hello, my name is Jiafu Zhang.”。

關(guān)鍵點(diǎn)

  • Unicode是把字符轉(zhuǎn)換到數(shù)字的標(biāo)準(zhǔn)。
  • Unicode里一個單獨(dú)的轉(zhuǎn)換叫做代碼點(diǎn)(code point)
  • Character數(shù)據(jù)類型存儲單獨(dú)的字符。
  • String數(shù)據(jù)類型存儲字符集合,或字符串。
  • 你可以用加法操作符來組合字符串。
  • 你可以使用字符串插入(string interpolation)按原樣創(chuàng)建字符串。
  • Swift標(biāo)準(zhǔn)化(canonicalization)的使用保證了使用組合字符的字符串的比較。

接下來去哪兒?

數(shù)字、布爾型和字符串是Swift里基本數(shù)據(jù)類型。最近的幾篇文章里你已經(jīng)讀到了全部關(guān)于數(shù)據(jù)類型和存儲數(shù)據(jù)的內(nèi)容;現(xiàn)在是時候回到代碼本身了!

在接下來的兩篇文章里,你會學(xué)習(xí)如何使用所有這些你現(xiàn)在知道的數(shù)據(jù)以及如何存儲它們。有了控制流和重復(fù)步驟,你就能讓代碼決定在數(shù)據(jù)上何時以及做一件事多少次。

挑戰(zhàn)

A挑戰(zhàn):你就是編譯器

下列哪個是有效狀態(tài)?

let character: Character = "Dog"
let character: Character = "??"
let string: String = "Dog"
let string: String = "??"

下面的代碼錯在哪里?

let name = "Matt"
name += "Galloway"

B挑戰(zhàn):結(jié)果預(yù)測

那個叫做sum的常量值是多少?

let value = 10
let multiplier = 5
let sum = "\(value) multiplied by \(multiplier) equals \(value * multiplier)"

介紹

歡迎來到Swift世界!Swift是一門蘋果在2014年夏天發(fā)布的編程語言。從那之后,Swift發(fā)布了一個主要的版本跳躍,成為了開始在蘋果平臺:iOS,OS X,watchOS和tvOS開發(fā)的最簡單的方式。

誰適合這篇教程

這篇教程適合懂一點(diǎn)編程、并且希望學(xué)習(xí)Swift的人。也許你已經(jīng)為網(wǎng)站寫過一些JavaScript代碼,或者用Python寫過一些簡短的程序。這篇教程就是為你準(zhǔn)備的!你會學(xué)習(xí)到編程的基本概念,同時也會成為Swift語言小能手。

如果你是赤裸裸的編程新手,這篇教程也是為你準(zhǔn)備的!教程里貫穿有簡短的鍛煉和挑戰(zhàn)來給你一些編程練習(xí),同時測試你的知識。

需要準(zhǔn)備什么

要看這篇教程,你需要準(zhǔn)備如下的東西:

  • 一臺運(yùn)行OS X El Captian(10.11)的Mac,帶有最新發(fā)布的更新并且安裝了安全補(bǔ)丁。這樣你才能夠安裝需要的開發(fā)工具:最新版本的Xcode。
  • Xcode 7.3或更新的版本。Xcode是用Swift寫代碼的主要開發(fā)工具。最小也需要Xcode 7.3版本,因為那個版本包含Swift 2.2。你可以免費(fèi)從Mac App Store下載Xcode的最新版本,這里:http://apple.co/1FLn51R

如果你還沒有安裝Xcode最新版本,在繼續(xù)看下面的教程前要確定安裝。

如何使用這篇教程

每篇教程都會介紹觸手可及的話題理論,伴隨大量Swift代碼來示范在學(xué)習(xí)的實際的應(yīng)用程序。

教程里的所有代碼都是平臺中立的;這意味著不是為iOS、OS X或任何其它平臺而特定。代碼在playgrounds里運(yùn)行,你在本篇中已經(jīng)學(xué)習(xí)了。

在剩下的教程里,你可以把代碼在自己的playground里輸入進(jìn)去。這樣你就可以和代碼“玩耍”(play around),做一些改變立即就能看見代碼運(yùn)行的結(jié)果。

剩下的教程里會貫穿實際小練習(xí),都是簡短的練習(xí),關(guān)于觸手可及的主題。每篇的末尾也有挑戰(zhàn),會有編程問題也會有長一點(diǎn)的代碼練習(xí)來測試你的知識。做完就能掌握大部分的Swift基礎(chǔ)知識。

教程更新

教程會隨Swift語言的更新而更新,會發(fā)布在我的簡書和知乎專欄上,搜索“張嘉夫”即可關(guān)注我。

目錄

本教程從一些基礎(chǔ)工作開始來讓你起步:

  • 第1篇,編程本質(zhì) & Playground基礎(chǔ) - 這就是,到編程世界的入門介紹!你會從電腦和編程的預(yù)覽開始,然后剩余時間給Swift playground打個招呼。
  • 第2篇,變量 & 常量 - 你會學(xué)習(xí)到變量和常量,這是用來存儲數(shù)據(jù)的“地方”。你也會學(xué)習(xí)數(shù)據(jù)類型以及Swift如何追蹤數(shù)據(jù)類型并在代碼中進(jìn)行傳輸。
  • 第3篇,數(shù)字類型 & 操作 - 你會從基礎(chǔ)的數(shù)字類型比如整形和浮點(diǎn)型數(shù)字開始,當(dāng)然也包括布爾類型。也會看到一些在實際操作,從比較到算數(shù)操作如加減。
  • 第4篇,字符串 - 用字符串來存儲文字-從按鈕里的文字到圖片的標(biāo)注到這篇教程全部的文字,存儲這所有的一切!你會學(xué)習(xí)到string和character類型,以及基于這些類型的一些常見操作。

在腦海中有基礎(chǔ)數(shù)據(jù)類型后,就該用那些數(shù)據(jù)做一些事情了:

  • 第5篇,做判斷 - 代碼不總是直接從頭運(yùn)行到尾。你會學(xué)習(xí)在代碼里如何做判決并且設(shè)定情況來運(yùn)行某段代碼。
  • 第6篇,重復(fù)步驟 - 繼續(xù)不要讓代碼直線運(yùn)行的主題,你會學(xué)習(xí)到如何使用循環(huán)來重復(fù)某些步驟。
  • 第7篇,函數(shù) - 函數(shù)是Swift中用來構(gòu)建代碼的基礎(chǔ)建筑。你會學(xué)習(xí)到如何定義函數(shù)來分組代碼到可復(fù)用單元中。
  • 第8篇,閉包(Closures) - 閉包和函數(shù)很接近。你會學(xué)習(xí)到如何使用它們來輕松傳遞代碼塊。

最后一篇會回到數(shù)據(jù):

  • 第9節(jié),可選值 - 這篇講可選值,Swift中的一種特殊類型,表示既有可能是一個真實的值也有可能沒有值。這篇的最后你會知道為什么要用可選值以及如何安全地使用它們。

這些基礎(chǔ)會讓你快速開始Swift之路,做好接觸更高級編程主題的準(zhǔn)備。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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