Swift 開發 iOS 應用教程

類別: IT
標籤: swift

蘋果最近宣佈了一個改變iOS應用既往開發的一個大變化,一種取代Objective-C稱為Swift的完全不同的程式語言。我正在努力學習這門新語言,而且我決定將按照我的學習程式定期釋出並共享我所找到的內容。這是眾多主題的第一篇文章,我希望你能跟隨下去!

下面的Swift程式碼例子今後有極大的可能會改變。這主要是因為我開發風格是先寫程式碼來測試理念,然後再重構,這主要是因為我(也可能是大家)對Swift完全是新手且正在學習。因此正如我過去學東西一樣,隨著時間的推移本教程也會隨之改變。我會根據需要更新的示例程式碼,但沒有學習過程時這麼多,驗證程式碼也是如此。我覺得這樣也是個有幫助的過程。

所以我要從一個非常基本的應用開始,來解釋程式碼如何工作。準備好了嗎?讓我們開始吧。

基礎

Swift沒有遵從標準的變數宣告模式——將變數型別放在變數名前,而是選擇類似JavaScript的‘var’關鍵字來定義所有變數。

比如你在Objective-C中這樣例項化:

NSString *myString = @"This is my string.";

你現在需要這樣:

var myString = "This is my string."

同時常數使用 ‘let’關鍵字來設定

let kSomeConstant = 40

在這種情況下kSomeConstant被隱式地定義為一個整數。如果你想更詳細也可以指定型別,像這樣:

對於陣列和字典,使用方括號[]來描述

var colorsArray = ["Blue", "Red", "Green", "Yellow"]
var colorsDictionary = ["PrimaryColor":"Green", "SecondaryColor":"Red"]

其他還有很多,但是我認為這些基礎對作為教程的開始很重要。下面,讓我們開始“Hello World”。

Hello World

Hello World in Swift and iOS

首先,我們會寫一個最簡單的起步應用,Hello World。

這個應用只做了一件事:在控制檯上列印出"Hello World"。你想要跟上技術前進的潮流的話,就需要下載XCode,這要求你有一個開發者賬號。如果你已經有了開發者賬號,那麼就請前往http://devloper.apple.com ,獲取XCode。

至此,你已經建立好了整合開發環境。現在就可以向控制檯列印hello world了。這個例子不僅僅向你展示了可以完成構建的最簡單的應用,同時更為重要的是證明了你已經正確地建立了開發環境。

使用單一檢視應用模板建立Xcod專案,然後確定你選擇使用Swift語言。在專案的目錄樹裡,現在你應當能夠看到檔案AppDelegate.swift。 在這個檔案裡,你可以找到如下一行:

"// Override point for customization after application launch."
使用下面神奇的hello world程式碼替代上面這行:
println("Hello World")
然後,按Run,你將會看到一個空白的應用啟動起來,接著在控制檯上列印出詞語"Hello World"。恭喜你,你已經用Swift編寫出第一個應用!雖然這個應用不可以獲得任何讚許,卻可以讓我們基於它進行更深入的探討。

新增表格檢視

在這一小節了,我們將真正地給螢幕上放置一些素材,非常好玩!

請先在Xcode裡開啟Main.storyboard檔案,然後從物件庫拖動"Table View"物件。把這個物件放置在應用視窗裡,並使它填滿整個螢幕,然後確保表格檢視與各個邊對齊。此時如果你執行此應用,你將在模擬器裡看到的是一個空的表格檢視。

現在,我們需要給表格檢視設定delegate和資料來源。使用介面構建器做這些工作非常簡單。只要一直選中表格檢視,然後點選,並拖拉表格檢視到storyboard檔案列表裡的"檢視控制器“物件裡。緊接著選擇”資料來源“即可。類似的可以設定"delegate"。

好了,現在我們就可以更深入的看看錶格檢視的通訊協議的處理方法了。由於我們在檢視控制器裡使用了UITableViewDataSource和

UITableViewDelegate,所以我們需要按照如下方式修改類的定義。

開啟ViewController.swift,修改如下行:

class ViewController:UIViewController {


class ViewController:UIViewcontroller,UITableViewDataSource,UITableViewDelegate{

在上面兩個通訊協議中的任何一個點選+號就會在最前端顯示所有的函式。在當前的表格檢視裡,我們至少需要兩個函式:

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!)
               -> UITableViewCell!

現在,我們修改檢視控制類,新增下面兩個函式:

func tableView(tableView: UITableView!, numberOfRowsInSection section:    Int) -> Int {
   return 10
}
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) 
    -> UITableViewCell! {
   let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, 
   reuseIdentifier: "MyTestCell")

   cell.text = "Row #\(indexPath.row)"
   cell.detailTextLabel.text = "Subtitle #\(indexPath.row)"

   return cell
}

第一個函式是獲取表格所佔用的行數,在這個例子裡我們只是硬編碼其為10,然而通常這個值是表格檢視控制器陣列的長度。現在例子裡這麼做純粹為了簡單。

第二個函式是發生變化的魔法所在。在這個函式裡,我們建立了呼叫每個表格的UITableViewCell例項,而且標題風格為表格所帶風格。

接著,我們給每個表格賦予文字串"Row#\(indexPath.row)"。

在Swift裡,就是這樣在字串中嵌入變數的。現在我們正在做的事情就是通過在字串中嵌入(\indexPath.row)來獲取indexPaht.row的值,可以用表格的行數動態的替代這個值。這樣就會產生下面結果:"Row #1","Row #2"等等。

這個詳細文字標籤之在子標題單元格中可用,就是我們在這使用的這個。我們把它設定為類似於“Subtitle #1″,“Subtitle #2″,等等。

繼續往下來,執行你的應用,你將看到一個讓人驚訝的單元格列表,它顯示有標題、副標題以及行數。這是在iOS中顯示資料最常用的方法,這必然會對你有所幫助。想看我檢視控制器檔案完整的原始碼的話,看這裡吧:ViewController.swif

在第二部分中,我們將探討一個應用,這個應用使用iTunes的搜尋API來發現並顯示iTunes商店裡的專輯。

在第一部分中我們研究了一些Swift的基礎,並搭建了一個簡單的示例專案,建立了一個表檢視並在其中放置了一些文字。如果你沒讀過,到這裡讀一下吧

在本節中,我們要做一些更有抱負的事。我們將要接觸到iTunes商店的搜尋API,下載JSON結果,將它們解析為字典然後用這些資訊填充我們的Table檢視。然後,我們將為Table檢視新增單擊事件來新增一些使用者互動,當點選一個專案後iTunes商店的相應專案將被開啟。

這聽起來好像工作量很大,別擔心。這些都是iOS應用非常基本的功能,它也是每個開發者都要做的最普通的事情。那我們繼續吧。

連線到UI

我們需做的第一件事是得到一個Table試圖的引用,以便在在程式碼中使用它。繼續往下走將下面這行新增到viewcontroller.swift檔案中,放在類定義的下方,但要在任何函式之外。

@IBOutlet var appsTableView : UITableView

這段程式碼可以連線我們分鏡頭中的Table試圖到“appsTableView”這個變數中。儲存該檔案並開啟該分鏡。現在,通過ctrl鍵+單機+拖動,將Table檢視拖動到“View Controller”物件,這樣便完成了這些物件的連線。容易吧?

使用API進行網路請求

現在我們已經實現了與UI的關聯,下面就準備進行API呼叫。建立一個名為searchItunesFor(searchTerm:String)的函式。我們用它來實現對任意搜尋詞的網路請求。

為了保持這邊文章簡短,我將只發布結尾處的程式碼,並對部分註釋進行說明。我們總是在說明部分提出幾個問題,然後再做出進一步討論,因此話題範圍將非常廣泛!

func searchItunesFor(searchTerm: String) {

   // iTunes API要求使用+分隔多個搜尋詞,因此在這兒用+號替代空格符
   var itunesSearchTerm = searchTerm.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil)

   // 現在轉義哪些無法識別出其是URL字元的其他字元
   var escapedSearchTerm = itunesSearchTerm.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
   var urlPath = "https://itunes.apple.com/search?term=\(escapedSearchTerm)&media=software"
   var url: NSURL = NSURL(string: urlPath)
   var request: NSURLRequest = NSURLRequest(URL: url)
   var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)

   println("Search iTunes API at URL \(url)")

   connection.start()
}

我們逐行看看上面程式碼。

首先,我們需要對傳入搜尋詞進行修正,搜尋API要求搜尋詞的格式為"第一個搜尋詞+第二個搜尋詞+第三個搜尋詞+其他搜尋詞",而不是"第一個搜尋詞%20第二個搜尋詞%20第三個搜尋詞%20..."。因此,我們沒有呼叫URL編碼函式,而是呼叫了sringByReplacingOccurenesOfString的NSString方法。這個方法將返回搜尋變數的修正版本,使用+號替代了其中的空格符。

接著,我們轉義了搜尋詞中哪些無法識別為URL所包含的字元。

再接下來的兩行定義了NSURL物件,這個物件將做為iOS網路API的URL引數。

以下兩行非常關鍵:

var request: NSURLRequest = NSURLRequest(URL: url)
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)

第一行使用我們前面建立的url變數作為URL引數來建立NSURLRequest物件。接著第二行建立了即將真正用來傳送請求的“連線”。注意:我們設定引數中的delegate為該物件自身。這樣我們就可以在檢視控制器類的內部偵聽連線傳送來的響應資訊。

最後,使用connection.start()傳送請求。

接收響應之前要做的準備工作

現在我們已經有一個方法可以請求iTunes搜尋結果了。這時,在viewDidLoad..的末尾處要插入下面這行:

searchItunesFor("JQ Software")

這樣我們就可以在iTunes商店裡查詢哪些包含上面關鍵詞的任何軟體產品了,此時搜尋的結果將包含幾年前我所編寫的兩個遊戲和幾個較新的軟體。當然,你也可以按照自己的意願更換搜尋字串。

接下來,為了能夠真正地接收到響應資料,我們需要跟蹤包含返回結果的資料物件。首先,給當前類裡增加一個成員:NSMutableData例項,即在類的定義插入下面一行,這行位於大括號之內。要能接收資料,我們還需要建立一個用來儲存表格資訊陣列。

var data: NSMutableData = NSMutableData()
var tableData: NSArray = NSArray()

接下來,我們一起看看NSURLConnection傳送我們編寫的類的函式,由於它是傳送請求的代理,所以我們希望NSURLConnection傳送的任何資訊都能夠通過在NSURLConnectionDeatDelegate和NSURLConnectionDelegate裡定義的通訊方法回送。如果你還不明白,請不要著急。接著向下看,你將很快明白這些是如何執行的。

Swift 開發 iOS 應用教程原文請看這裡

推薦文章