讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 前言 >

前言

2014年6月2日,蘋果公司在WWDC大會最後宣佈了一項令人震驚的公告:「我們開發了一門全新的編程語言。」開發者社區對此感到非常驚訝,因為他們已經習慣了Objective-C,因此開始懷疑蘋果公司是否有能力將既有資產遷移過來。不過,這一次開發者社區錯了。

Swift發佈後,眾多開發者立刻開始檢視這門新語言:學習並批判它,決定是否該使用它。我的第一步就是將自己所有的iOS應用都轉換為Swift;這足以說服我自己,雖然Swift有各種各樣的缺點,但它值得每一個iOS編程新兵去掌握;自此以後,我的書都會假設讀者使用的是Swift。

Swift語言從一開始的設計上就具備如下主要特性:

面向對像

Swift是一門現代化的、面向對象的語言。它是完全面向對象的:「一切皆對象。」

清晰

Swift易於閱讀和編寫,其語法糖很少,隱藏的捷徑也不多。其語法清晰、一致且明確。

安全

Swift使用強類型,從而確保它知道(並且你也知道)在每一時刻每個對象引用都是什麼類型的。

小巧

Swift是一門小巧的語言,提供了一些基本的類型與功能,除此之外別無其他。其他功能需要由你的代碼,或你所使用的代碼庫(如Cocoa)來提供。

內存管理

Swift會自動管理內存。你很少需要考慮內存管理問題。

兼容於Cocoa

Cocoa API是由C和Objective-C編寫的。Swift在設計時就明確保證可與大多數Cocoa API交互。

這些特性使得Swift成為學習iOS編程的一門優秀語言。

其他選擇Objective-C依然存在,如果你喜歡還可以使用它。實際上,編寫一個同時包含Swift代碼與Objective-C代碼的應用是很容易的;有時也需要這麼做。不過,Objective-C缺少Swift的一些優勢。Objective-C在C之上增加了面向對像特性。因此,它只是部分面向對象的;它同時擁有對象與標量數據類型,其對像需要對應於一種特殊的C數據類型(指針)。其語法掌握起來很困難;閱讀與編寫嵌套的方法調用會讓人眼花,它還引入了一些黑科技,如隱式的nil測試。其類型檢查可以而且經常關閉,這會導致程序員犯錯,將消息發送給錯誤的對象類型並導致程序崩潰。Objective-C使用了手工的內存管理;新引入的ARC(自動引用計數)減輕了程序員的一些負擔,並且極大地降低了程序員犯錯的可能性,不過錯誤依舊有可能發生,內存管理最終還是要靠手工來完成。

最近向Objective-C增加或修訂的特性(ARC、合成與自動合成、改進的字面值數組與字典的語法、塊等)讓Objective-C變得更加簡單和便捷,不過這些修復也使語言變得更加龐大,甚至會引起困惑。由於Objective-C必須要包含C,因此其可擴展和修訂的程度會受到限制。另一方面,Swift則是個全新的開始。如果你夢想完全修訂Objective-C,從而創建一個更棒的Objective-C,那麼Swift可能就是你所需要的。它將一個先進、合理的前端置於你與Cocoa Objective-C API之間。

因此,Swift就是本書通篇所使用的編程語言。不過,讀者還需要對Objective-C(包括C)有所瞭解。Foundation與Cocoa API(這些內建的命令是你的代碼一定會用到的,從而讓iOS設備上的一切可以實現)依舊使用C與Objective-C編寫。為了與它們進行交互,你需要知道這些語言需要什麼。比如,為了在需要NSArray時可以傳遞一個Swift數組,你需要知道到底是什麼對象可以作為Objective-C NSArray的元素。

因此,本書雖然不會講解Objective-C,但我會對其進行足夠充分的介紹,從而使你在文檔和互聯網上遇到這類問題時能夠知道解決方案,我還會時不時地展示一些Objective-C代碼。本書第三部分關於Cocoa的介紹會幫助大家以Objective-C的方式來思考——因為Cocoa API的結構與行為基本上是基於Objective-C的。本書最後的附錄會詳細介紹Swift與Objective-C之間的交互方式,同時還會介紹如何以Swift和Objective-C混合編程來編寫應用。

本書範圍

本書實際上是我的另一本書《Programming iOS 9》的配套參考書,該書以本書的結束作為起點。它們之間是互補的。我相信,這兩本書的結構合理、內容通俗易懂。它們提供了開始編寫iOS應用所需的完整基礎知識;這樣,在開始編寫iOS應用時,你會對將要做的事情以及方向有著深刻的理解。如果編寫iOS程序類似於用磚蓋房子,那麼本書將會介紹什麼是磚以及如何使用它,而《Programming iOS 9》則會給你一些實際的磚並告訴你如何將其堆砌起來。

閱讀完本書後,你將知道Swift、Xcode以及Cocoa框架的基礎,接下來就可以直接開始閱讀《Programming iOS 9》了。相反,《Programming iOS 9》假設你已經掌握了本書所介紹的內容;一開始它就會介紹視圖與視圖控制器,同時假設你已經掌握了語言本身和Xcode IDE。如果開始閱讀《Programming iOS 9》並且想知道書中一些沒有講解過的東西,如Swift語言基礎、UIApplicationMain函數、nib加載機制、Cocoa的委託與通知模式、保持循環等,那就不要嘗試在該書中尋找答案了,我並沒有在那本書中介紹這些內容,因為這裡都介紹過了。

本書的3部分內容將會介紹iOS編程的基礎知識:

·第一部分從頭開始介紹Swift語言。我沒有假設你知道任何其他的編程語言。我講解Swift的方式與其他人不同,如蘋果公司的方式;我會採取系統的方式,逐步推進,不斷深入。同時,我會講解最本質的內容。Swift並不是一門龐大的語言,不過卻有一些微妙之處。你無須深入到全部內容當中,我也不會面面俱到地講解。你可能永遠都不會遇到一些問題,即便遇到了,那也說明你已經進入到了高級Swift的世界當中,而這已經超出了本書的討論範圍。比如,讀者可能會驚奇地發現我在書中從來都沒有提到過Swift playground和REPL。本書的關注點在於實際的iOS編程,因此我對Swift的介紹將會關注在這些常見、實際的方面上;以我的經驗來看,這些內容才是iOS編程當中用得最多的。

·第二部分將會介紹Xcode,這是我們進行iOS編程的地方。我將介紹何為Xcode項目,如何將其轉換為應用,如何通過Xcode來查閱文檔,如何編寫、導航與調試代碼,以及如何在設備上運行應用並提交到App Store等過程。該部分還有重要的一章用來介紹nib與nib編輯器(Interface Builder),包括插座變量與動作,以及nib加載機制;不過,諸如nib中的自動佈局限制等專門的主題則不在本書的討論範圍之中。

·第三部分將會介紹Cocoa Touch框架。在進行iOS編程時,你會使用到蘋果公司提供的大量框架。這些框架共同構成了Cocoa;為iOS編程提供API的Cocoa叫作Cocoa Touch。你的代碼最終將是關於如何與Cocoa進行通信的。Cocoa Touch框架提供了iOS應用所需的底層功能。不過要想使用框架,你需要按照框架的想法去做,將代碼放到框架期望的位置處,實現框架要求你實現的功能。有趣的是,Cocoa使用的是Objective-C,你使用的是Swift:你需要知道Swift代碼如何與Cocoa的特性與行為進行交互。Cocoa提供了重要的基礎類,並添加了一些語言與架構上的設施,如類別、協議、委託、通知,以及關於內存管理的基本功能。該部分還會介紹鍵值編碼與鍵值觀測。

本書讀者將會掌握任何優秀的iOS開發者所需的基礎知識與技術;但本書並不會介紹如何編寫一個有趣的iOS應用,書中會大量使用我自己編寫的應用與實際的編程場景來闡述理論知識。接下來各位讀者就可以閱讀《Programming iOS 9》了。

版本

本書使用的是Swift 2.0、iOS 9與Xcode 7。

總的來說,本書並不會對老版本的iOS與Xcode做過多介紹。我也不會有意在書中對老版本的軟件進行講解,畢竟這些內容在我之前的書中都有過介紹。不過,本書會針對向後兼容性給出一些建議(特別是在第9章)。

Xcode 7所包含的Swift語言(Swift 2.0)相比於之前的版本Swift 1.2發生了很大的變化。如果之前使用過Swift 1.2,那麼你就會發現如果不做一些修改,代碼是無法在Swift 2.0中編譯通過的。與之類似,書中的代碼使用Swift 2.0編寫而成,它也完全無法與Swift 1.2保持兼容。你之前可能有過Swift 1.2的編程經驗,隨著我的不斷講解,你會發現不少重要的語言特性在Swift 2.0中都發生了變化。不過,我並不會介紹Swift 1.2;如果想要瞭解(雖然我不知道你為什麼要瞭解),那麼請參考本書的前一版。

致謝

首先感謝O』Reilly Media的工作人員,正是他們才讓一本書的寫作過程充滿了快樂:Rachel Roumeliotis、Sarah Schneider、Kristen Brown、Dan Fauxsmith與Adam Witwer。我也不會忘記編輯Brian Jepson,雖然他並未參與本版的工作,但對我的影響卻一直都在。

一直以來,一些優秀的軟件對我起到了巨大的幫助作用,我在寫作本書的過程中一直都心存謝意。這些軟件主要有:

·git(http://git-scm.com)

·SourceTree(http://www.sourcetreeapp.com)

·TextMate(http://macromates.com)

·AsciiDoc(http://www.methods.co.nz/asciidoc)

·BBEdit(http://barebones.com/products/bbedit/)

·Snapz Pro X(http://www.ambrosiasw.com)

·GraphicConverter(http://www.lemkesoft.com)

·OmniGraffle(http://www.omnigroup.com)

我通過忠實的Unicomp Model M鍵盤(http://pckeyboard.com)完成了全書的輸入與編輯工作,如果沒有它我是不可能在如此長的時間內輕鬆敲下這麼多字的。請通過http://matt.neuburg.usesthis.com瞭解我的工作環境。

《Programming iOS 4》前言

編程框架體現了一個人的品格,它是創建者對於目標與心智的反映。第一次使用Cocoa Touch時,我對其品格的評價是這樣的:「喔,創建它的人真是絕頂聰明啊!」一方面,內建的界面對像數量有意得到了限制;另一方面,一些對象的功能與靈活性(特別是UITableView等)要比其OS X的對應者更加強大。更為重要的是,蘋果公司提供了一種聰明的方式(UIViewController)來幫助開發者創建整個界面並使用一個界面替換掉另一個,這些以一種可控、層次化的方式來實現,這樣小小的iPhone就可以在一個應用中顯示多個界面了,還不會讓用戶迷失或感到困惑。

iPhone的流行(大量免費與便宜的應用起到了很大的幫助作用)以及隨後iPad的流行讓很多新的開發者看到為這些設備編寫程序是值得的,雖然他們對OS X可能沒有相同的感覺。蘋果公司自己的年度WWDC開發者大會也反映出了這種趨勢,其重心也由OS X逐漸向iOS傾斜。

不過,人們渴望編寫iOS程序的想法也導致了這樣一種趨勢:還沒有學會走就開始跑了。iOS賦予了開發者強大的能力,心有多大舞台就有多大,不過這也是需要基礎的。我常常看到一些iOS開發者提出的問題,雖然他們在編寫著應用,但其對基礎知識的理解非常膚淺。

這種情況促使我寫作了這本書,本書旨在介紹iOS的基礎知識。我喜歡Cocoa,也一直希望能有機會寫一本關於Cocoa的圖書,不過iOS的流行卻讓我編寫了一本關於iOS的圖書。我嘗試採取一種合乎邏輯的方式進行說明和講解,介紹iOS編程所需的原則與元素。正如之前的圖書一樣,我希望你能完整閱讀這本書(學習新東西肯定會不停翻書),並將其作為案頭參考。

本書並不是要代替蘋果公司自己的文檔與示例項目。那些都是非常棒的資源,隨著時間的流逝將會變得越來越好。在準備本書寫作的過程中我也將其作為參考資源。但是,我發現它們並不是按照順序以一種合理的方式來完成一個功能的。在線文檔會假設你的預備知識;它不能確保你會按照給定的方式來完成。此外,在線文檔更適合作為參考而不是指南。完整的示例(無論註釋有多麼充分)都是難以跟著學習的;它可以作為演示,但卻無法作為教學資源。

另外,圖書的章節號和頁碼連續,內容的連貫性比較強;我可以在你學習視圖控制器之前假定你已經知道視圖了,因為第一部分位於第二部分之前。此外,我還會將自己的經驗逐步分享給你。在全書中,你會發現我不斷提及「常見的初學者錯誤」;除了一些其他人的錯誤,在大多數情況下,這些都是我曾經犯過的錯誤。我會告訴你一些陷阱,因為這些都是我曾經遇到過的,我相信你也一定會遇到。你還會看到我給出了不少示例,目的是解釋一個大應用的一小部分內容。這並非用於講解編程的一個已經完成的大程序,而是開發這個程序時的思考過程。我希望你在閱讀本書時能夠掌握這種思考過程。

本書約定

本書中使用以下排版約定:

斜體(Italic)

表示新術語、URL、電子郵件地址、文件名和文件擴展名。

等寬字體(Constant width)

表示代碼示例,以及插穿在文中的代碼,包括:變量或函數名、數據庫、數據類型、環境變量、語句,以及關鍵字。

等寬粗體(Constant width bold)

表示新術語、URL、電子郵件地址、文件名和文件擴展名。

等寬斜體(Constant width italic)

表示新術語、URL、電子郵件地址、文件名和文件擴展名。

這個元素表示提示或建議。

這個元素表示一般註解。

這個元素表示警告。

如何使用示例代碼

本書在這裡幫助你完成你的工作。總的來講,你可以在你的程序和文檔中使用本書中的代碼。你不需要聯繫我們以徵得許可,除非你正在複製代碼中的重要部分。比如,使用書中的多段代碼寫一個程序並不需要獲得許可。

若將O』Reilly公司出版的書中的例子製成光盤來銷售或發行則需要獲得許可。在回答問題時,引用本書和列舉書中的例子代碼並不需要許可。把本書中的代碼作為你產品文檔的重要部分時需要獲得許可。

我們希望但並不要求你在引用本書內容時說明引文的文獻出處。引用通常包括題目、作者、出版社和ISBN號。例如,《iOS 9 Programming Fundamentals with Swift》,Matt Neuburg(O』Reilly)。Copyright 2016 Matt Neuburg,978-1-491-93677-1。

如果你感覺你對代碼示例的使用超出合理使用以及上述許可範圍,請通過[email protected]聯繫我們。

SafariR圖書在線

Safari圖書在線(www.safaribooksonline.com)是一個按需數字圖書館,它採用圖書和視頻兩種形式發佈專業級的內容,作者都是來自技術和商業領域的世界頂尖專家。

技術專家、軟件開發者、網站設計者和商業及創新專家都使用Safari圖書在線作為他們研究、解決問題、學習和職業資格培訓的首要資源。

Safari圖書在線為各種組織、政府機構和個人提供豐富的產品和定價程序。訂購者可在一個全文可檢索數據庫中瀏覽數以千計的圖書、培訓視頻和預出版手稿。它們來自O』Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology等的眾多出版社。關於Safari圖書在線的更多信息,請在線訪問我們。

如何聯繫我們

美國:

O』Reilly Media,Inc.

1005 Gravenstein Highway North

Sebastopol,CA 95472

中國:

北京市西城區西直門南大街2號成銘大廈C座807室(100035)

奧萊利技術咨詢(北京)有限公司

我們為本書提供了網頁,該網頁上面列出了勘誤表、範例和任何其他附加的信息。您可以訪問如下網頁獲得:

http://oreil.ly/HP-Drupal

要詢問技術問題或對本書提出建議,請發送電子郵件至:

[email protected]

要獲得更多關於我們的書籍、會議、資源中心和O』Reilly網絡的信息,請參見我們的網站:

http://www.oreilly.com.cn

http://www.oreilly.com