Swift 初學者 ( 1/9 ) 編程本質 & Playground基礎

簡介

這是一個Swift語言教程,更新至 iOS 10,Xcode 8 和 Swift 3,會為你介紹Swift編程非?;A的內容。從電腦如何工作的全程基本原理到語言結構,你會足夠了解這門語言,來處理數據和管理代碼的行為。

快速鏈接


在第一篇里,你會學習一些基礎。先學習代碼是如何運作的,再學習使用寫Swift代碼的工具。

電腦是怎么工作的

你可能不太相信,但電腦本身就是個智障。電腦的強力都是因為像咱們這樣的人編程才能驅動。要想很成功地利用電腦的能力——既然你都看這篇文章了我猜你也是這么打算的——理解電腦是如何工作的非常重要。

你可能會驚訝,電腦本身其實就是一臺簡單的機器而已。電腦的心臟是中央處理單元(CPU)。其實它本質上是一臺數學機器。用來做加減法和其它算數操作。操作電腦的時候,萬物基于CPU,每秒“嘎吱嘎吱”咀嚼數字幾百萬次。這是都基于數字而已,是不是很神奇?

CPU把它操作的數字存在一個很小的叫做寄存器的存儲器里。CPU可以從電腦里叫隨機存取存儲器(RAM)的主存儲器中讀取數字到寄存器中。它也能把存儲在寄存器中的數字存儲到RAM中。這讓CPU能處理大量數據,而不會都擠在寄存器那里。

這是他們工作的示意圖:

在CPU從RAM讀取值到寄存器里的時候,它在數學單元中使用這些值,然后把結果保存回到另一個寄存器中。

每次CPU做加減法、一次從RAM的讀取或一次向RAM的寫入的時候,它在執行一條單獨的指令(instruction)。每個電腦程序通常由數千到數百萬行指令組成。一個復雜的電腦程序,比如你的操作系統,Mac OS X(是的,這也是一個電腦程序?。?,總共應該有數百萬行指令。

寫一條條單獨的指令來告訴電腦該干嘛是完全有可能的,但即使是最簡單的程序,這樣都會極其耗時而且很單調乏味。因為大部分電腦程序的目標都是做一些遠遠要比小學數學要復雜的事情——電腦程序可以處理圖片,還讓你能網上沖浪以及和朋友聊天。

所以不是寫一條條單獨的指令,而是用一門特定的編程語言代碼,在這個情境中里就會是Swift啦。這些代碼通過一個叫做編譯器的電腦程序來實現,它把代碼轉換為CPU知道如何執行的指令。你寫的每一行代碼都會成為許多行指令——幾行代碼最終可能會是數十行指令!

表示數字

現在你知道了,數字是一臺電腦的黃油和面包,是它做所有事情的基礎。不論你給編譯器什么信息,最后都會變成數字。例如,一個代碼塊里文字的每個字符最終其實都由數字來表示。你在第4篇文章里會學習到更多相關內容,探索字符串,這是用來表示一塊文字的計算機術語。

圖片也不例外:電腦里,每張圖片也都是由一系列數字表示的。一張圖片被分為數千甚至數百萬塊,每一塊叫做像素,這里每個像素都是一種純色。如果你貼近看電腦屏幕,你應該可以辨別出每一塊。除非你有一個特別高分辨的顯示器,每個像素都太他媽小了!每個這些純色像素通常都由三個數字表示:一個表示紅色的含量,一個表示綠色的含量還有一個表示藍色的含量。例如,一個完全紅色像素會是100%紅色,0%綠色和0%藍色。

CPU處理的數字和你過去用的尤其不同。日常生活里你和數字打交道,都用基數10,也被叫做十進制系統。你已經使用這種數字系統這么久了,憑直覺你也會知道它怎么用,但還是讓我們再仔細看看原理,這樣可以從CPU視角來體會一下。

十進制或基數10的數字423包含三個個位、兩個十位和四個百位

在基數10系統里,每一位數字可以是0,1,2,3,4,5,6,7,8或9,每一位都共有十種可能性。必須的,這就是它為什么被稱作基數10!

但每一位真實表示的值都由它在數字里的位置決定。從右邊移動到左邊,每個數字都與不斷增加的10的冪數相乘。所以最右端位置的乘數是10的0次方,就是1。往左移,下一個乘數是10的1次方,就是10。再次往左移動,下一個乘數是10的2次方,就是100。然后繼續。

這意味著每位是它在右側的值的10倍。數字423因此等于:

(0 * 1000) + (4 * 100) + (2 * 10) + (3 * 1) = 423

二進制數字

因為你一直被訓練使用基數10,所以不需要思考如何讀大部分數字——感覺很自然。但對于電腦來說,基數10實在太復雜了!電腦都是智障,記得嗎?他們喜歡用基數2。

基數2通常被稱為二進制,你之前就應該聽過它吧。注意基數2每一位只有兩個選項:0或1。

幾乎所有現代計算機都用二進制,因為在物理層每一位數字只處理2個選項是最簡單的。電腦大部分是由數字電路系統組成的,電流存在是1,不存在是0——這就是基數2!

注意:曾經有些真實的或幻想出來的電腦使用三進制系統,它們有3個可能值而不是2個。電腦科學家、工程師和職業黑客繼續在探索基數3電腦的可能性??梢钥?a target="_blank" rel="nofollow">https://en.wikipedia.org/wiki/ Ternary_computer和http://hackaday.com/tag/ternary-computer/

這是基數2數字1101的表示:

在基數10數字系統里,值的乘數是10的次方:1,10,100,1000,等等。但在這里,你會發現它們值的乘數是2的次方:1,2,4,8,16,等等。主要原則就是用不斷增長的基數的次方作為乘數——這種情況下就是2的次方——從右向左移動。

所以最右一位表示(1 * 2^0),就是(1 * 1),就是1。左邊下一位表示(0 * 2^1),就是(0 * 2),就是0。上面的插圖里,可以每一塊上方看到2的次方。

換種方式說,每一位的乘數要么是1要么是0,這就是二進制數字的組成部分。十進制版本的二進制數就是把所有2的次方結果相加,組成新的數字。所以二進制數字1101等于:

(1 * 8) + (1 * 4) + (0 * 2) + (1 * 1) = 13

如果你想把基數10數字423轉為二進制,只需要把423拆為由2的次方組成。你會得到:

(1 * 256) + (1 * 128) + (0 * 64) + (1 * 32) + (0 * 16) + (0 * 8) + (1 * 4) + (1 * 2) + (1 * 1) = 423

可以看到,掃視一下上方等式的二進制位數,結果的二進制數字是110100111。你可以自己做數學,證明這和423相等!

二進制每一位的計算機術語叫做比特(bit)。8個比特組成一個字節(byte)。4個比特被稱作nibble,一個文字游戲可以看出即使是老派的計算機科學家也很幽默??。

電腦的有限的內存意味著它能處理的數字最大長度是固定的。舉個例子,每個寄存器通常是32或64個比特長度,所以我們常說32位和64位CPU。

因此,32位CPU可以處理最大基數10數字4,294,967,295,就是基數2數字 11111111111111111111111111111111。一共32個1——數數看!

電腦其實可以處理比CPU能處理的最大數字還要大的數字。但計算會被分割,用一種特別的、更長的方式管理,很像你在學校算的長乘法算式。

十六進制數字

可以想象,用二進制數字會變得非常單調乏味,因為寫或記錄它們會要很長時間。所以,在電腦編程里我們通常會使用另一種數字格式叫做十六進制,簡寫是hex。這就是基數16。

當然,每一位沒有各不相同的16個數字;只有10個。所以要補充一下,我們用前6個英文字母,af 。它們和這些十進制數字相等:

  • a = 10
  • b = 11
  • c = 12
  • d = 13
  • e = 14
  • f = 15

這是一個用和剛剛說的格式的基數16例子:

首先注意你可以創造看起來就像單詞一樣的16進制數字。這意味著可以找到一點樂趣。:]

現在每一位的值都和16的次方結果相關。和之前一樣的方式,你可以像這樣把它轉化到10進制:

(12 * 4906) + (0 * 256) + (13 * 16) + (14 * 1) = 49374

翻譯字母到相等的十進制值,然后計算一下。

但為什么要這么煩呢?

16進制很重要,因為每個16進制位都恰好能表示4位2進制。二進制數字1111和16進制的f相等。因此,你可以簡單地串聯二進制來表示每位16進制,創造一個比相等的二進制或十進制要短的16進制數。

舉個例子,想想上面的數字c0de:

c = 1100
0 = 0000
d = 1101
e = 1110

c0de = 1100 0000 1101 1110

這樣會變得非常有幫助,給出了電腦是如何使用32位或64位長的二進制數字的?;叵胱铋L的32位數字在十進制里是4,294,967,295。十六進制里是ffffffff??雌饋砬逦?、簡潔地多。

代碼如何工作

電腦有很多限制,它們自己只能做一些很小的事情。程序員通過代碼為電腦添加的能力,把這些小事情按照正確的順序組裝到了一起,來做一些遠遠更偉大的事情。

代碼很像寫食譜。收集原料(數據)然后給電腦一個按步驟操作的食譜告訴它怎么使用原料。

這是一個例子:

第1步。從硬盤加載照片。

第2步。改變照片大小為400像素寬、300像素高。

第3步。對照片使用sepia濾鏡。

第4步。打印照片。

這就是傳說中的偽代碼。它不是由有效的電腦編程語言寫出來的,但它表示了你想使用的算法。這個例子里,算法拿到了一張照片,改變了大小,加了一個濾鏡然后打印了它。這是相對簡單的算法,但至少也是個算法呀!

Swift代碼就是像這樣的:一個一步步來的電腦指令清單。在你看接下來的文章的時候,這些指令會變得越來越復雜,但原則是相同的:你只要簡單地告訴電腦該干嘛,一次一小步。

每門編程語言是用高級、預定義的方式來表達這些步驟。編譯器知道如何解釋你寫的代碼然后把它轉化為CPU能執行的指令。

有許多不同的編程語言,每個都有自己的優點和缺點。Swift是一門非常現代化的語言并且它還只在開發的起步階段。它對許多其他語言取其精華去其糟粕。在未來的幾年里,我們再回看Swift也會覺得老、生硬。但是現在,它是一門非常令人激動的語言,因為它在快速進化。

以上是關于電腦硬件的一個簡短游覽,數字表示、代碼以及他們一起如何創造一個現代化程序。但這里根本不夠講!如果你繼續看這篇文章的話,現在是學習你用來寫Swift的工具的時間了。

Playgrounds

用來寫軟件的工具集通常被叫做工具鏈。工具鏈中用來寫代碼的部分叫做集成開發環境(IDE)。Swift最常用的IDE叫做Xcode,也就是你即將要使用的。

Xcode有一個好用的特色叫做Playground,可以讓你快速寫然后測試代碼,而不用構建一個完整的app。我在接下來的Swift教程中都會用playground來練習代碼,所以理解它如何工作很重要。這就是你在這篇文章的剩余部分會學習的東西。

創建一個Playground

當你打開Xcode,它會用下面的歡迎界面向你打招呼:

如果你看不到這一屏,非常有可能是因為“Show this window when Xcode launches”選項被勾掉了。你也可以按Command-Shift-1來打開屏幕,或者點擊菜單欄里的Window\Welcome to Xcode

從歡迎屏里你可以快速跳到一個playground里,通過點擊Get started with a playground?,F在點一下,Xcode會帶你到一個新的屏幕:

在這里,你可以命名playground然后選擇你的目標平臺。名字只是用來裝點門面的,自己用的;當你創建playground的時候,放松選擇一個可以幫助你記住它是關于什么內容的名字。例如,當你在學習第2篇教程的時候,你可能想命名這個playground為Tutorial2

這兒能看到的第二個選項是平臺?,F在既可以選擇iOSMac。

你選擇的那個只是簡單地定義Xcode將要用哪個模板創建playground。每個平臺都有它們自己的環境設置,為你準備好到那個平臺去和代碼玩耍(play around)。因為這篇教程的特點,隨便你選哪個,反正你也不會寫特定平臺的代碼。你要學習的是Swift語言的核心理念!

當你選擇好一個名字和一個平臺后,點擊Next然后保存playground。Xcode然后會為你展示playground,像這樣:

Playgrounds預覽

第一眼看上去,playground就像一個高級記事本。好吧,告訴你一個大新聞:實際上它就是!

上面的截圖標明的部分是首先需要知道的事也是最重要的事:

  1. 源編輯器。這是你寫Swift代碼的地方。這很像一個文本編輯器比如Notepad或文本編輯(TextEdit)。你會看到叫做單間隔字體的使用,意味著所有字符都一樣寬。這讓代碼讀起來更輕松。
  2. 結果邊欄。這個區域顯示你的代碼運行的結果??赐耆拷坛毯螅銜W到更多代碼是如何執行的。結果邊欄會是查看來確定代碼的確是預想地那么工作的主要區域。
  3. 執行控制。Playgrounds默認自動執行代碼,意味著你可以寫代碼,然后立即看到輸出的結果。這個控制讓你可以再次執行一遍playground代碼。按住按鈕可以在自動執行和手動執行模式之間切換。
  4. 活動查看器。它顯示了playground的狀態。在截圖里,它顯示playground已經執行完,準備好在源編輯器里處理更多代碼。playground在執行的時候,這個查看器會指示一個菊花。
  5. 版塊控制。這些開關決定顯示和隱藏3個版塊,一個顯示在左邊,一個在底部還有一個在右邊。這些版塊每個都顯示一些你可能需要時時訪問的額外信息。通常會讓它們保持隱藏,就像它們在截圖里那樣。繼續讀本書的時候你會學習到關于每個版塊更多的內容。

Playground從上到下執行源編輯器里的代碼。每次你改變代碼,playground會重新執行所有代碼。當然你也可以強行重新執行一遍,通過點擊Editor\Execute Playground。不然你也可以使用執行控制。

你也可以打開源編輯器里左側的行號,通過點擊Xcode \Preferences...\Text Editing\Line Numbers。行號在想參考某部分代碼的時候會很有用。

一旦playground執行完畢了,Xcode會更新結果邊欄來在源編輯器里顯示相應行的結果。當你看完所有Swift教程后,會知道如何解釋代碼執行的結果。

關鍵點

  • 電腦在最基本的級別只執行簡單的算數。
  • 編程語言讓你能寫代碼,代碼可以被編譯器轉換到CPU能夠執行的指令。
  • 電腦用基數2形式來操作數字,也就是熟知的二進制。
  • 寫Swift代碼的編輯器叫做Xcode。
  • 通過提供代碼是如何執行的及時反饋,playground讓你能快速、有效地寫并且測試Swift代碼。

介紹

歡迎來到 Swift 初學者,完全更新到 Swift 3!

自從在2014年發布,Swift 已經經歷了兩個主要的版本,并且是開始為蘋果平臺做開發最簡單的方式:iOS,macOS,watchOS 和 tvOS。隨著在2015年底完全開源,它開始傳播到其它平臺,比如 Linux。

Swift 對于準備開始編程的人來說是一個絕佳的選擇,因為 Xcode 提供了一個沙盒類型的環境,你可以直接執行 Swift 語句來嘗試語言的多個元素——而不用先創建一個完整的app。

盡管 Swift 對于學習編程是一個絕佳的語言,它也是一個工業級的語言,全世界的開發者用來為 iPhone、iPad、Mac、Apple TV和Apple Watch開發數千種神奇的app。這意味著你在這本書里學到的東西會在你擴展開發技能的時候很有用,并且對日后可能成為一個 app 開發者也很有用。

你會學習基礎的東西例如常亮、變量和類型,然后移步更多更復雜的東西比如數據結構、類和枚舉,并且以一些深入知識結尾,關于協議擴展、自定義操作符和面向協議編程,很多主題和其它語言類似,另外一些 Swift 用與眾不同的方式來提供。

Swift 也充滿了樂趣!在測試新創意的時候可以很隨意地嘗試一小段代碼并且和不同的值一起玩耍。編程是一個需要切身實踐的體驗,Swift 讓你可以很快很輕松地跟隨本書一起做,也可以探索自己的。

這篇教程是寫給誰的

如果你是一個完全編程新手,這就是為你準備的教程!貫穿本書有短的練習和挑戰來給你一些編程實踐,也一起測試你的知識。

你需要什么

要跟上這篇教程,你需要如下的東西:

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

如果你還沒有安裝Xcode最新版本,在繼續看下面的教程前要確定安裝。這篇教程包含的代碼基于 Swift 3 和 Xcode 8——如果你用一個老版本來進行會很快就迷失掉的。

如何使用這篇教程

每篇教程都會介紹手頭的話題理論,伴隨大量Swift代碼來示范在學習的實際的應用程序。

因為這是一本初學者的教程,我們推薦第一次閱讀按順序來。在那之后,這篇教程將為你提供一個很好地參考,以恢復和刷新你有關特定主題的記憶。

教程里的所有代碼都是平臺中立的;這意味著不是為iOS、macOS 或任何其它平臺而特定。代碼在playgrounds里運行,你會在第一篇中學習到。

在你跟隨本教程閱讀的時候,你可以跟著把代碼打到你自己的 playground 里。這意味著你將能夠通過做改變并且立即看見結果來和代碼玩耍。

你會在貫穿本書的過程中發現迷你練習,是關于手頭的主題的簡短練習。每篇文章最后也有挑戰,是編程問題或長的代碼練習,來測試你的知識。

你會掌握本書的大部分,如果你跟著做每個練習和挑戰的話。

教程更新

教程會隨Swift語言的更新而更新,會發布在我的簡書上,搜索“張嘉夫”即可關注我。

目錄

這份教程被分為四個部分。每個部分有一個簡短介紹,描述了它的章節、話題以及這部分的主旋律。

*###第一部分:Swift 基礎
本教程的第一部分從非常初級的電腦環境開始:首先,電腦如何工作,然后 Swift 的 playground 特色是如何工作的。在這些后勤工作做完后,你會開始學習 Swift 語言的基礎,然后學習管理數據、結構化代碼、做簡單操作和計算、使用類型的基礎。

*###第二部分:集合類型
存儲數據是所有 app 的核心部分,不論它是你的社交網絡 app 里的朋友列表,還是你的擊打游戲里的一組未解鎖角色。在這個部分,你會學習如何在 Swift 里存儲數據的集合。

*###第三部分:建立自己的類型
Swift 配備了基本的模塊,但它的真正的力量是在自定義的東西,你可以建立你的 app 的模型部分。

*###第四部分:高級主題
本教程的最終部分包含 Swift 里更多高級主題。你會學習

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

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

在腦海中有基礎數據類型后,就該用那些數據做一些事情了:

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

最后一篇會回到數據:

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

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

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

推薦閱讀更多精彩內容