練習:Tip Calculator 小費計算器
下一個App可以幫助用戶計算他們每次去餐廳吃飯時應該付多少錢給服務員嗎,用戶輸入總消費額,然后從3個費率:15%,20%和25%中挑一個費率,用戶點擊計算按鈕,消費數額就會出現在屏幕上。App完成版本的效果圖如下(見圖3-5):
Exercise: Tip Calculator | Page 71
現在你知道了App有哪些功能,那么打開Xcode吧,點擊Dock中的Xcode圖標,如果Dock中沒有Xcode,那么去Spotlight中搜索一下。
接著會出現熟悉的Xcode歡迎界面。關閉歡迎界面,點擊頂部菜單欄的File -> New -> Project(見圖3-6)。
Page 72 | Chapter 3 : Diving into Swift
從模板中選擇Single View Application,點擊Next(見圖3-7)。
Project的一些項目可能已經自動為你填寫好了。
Exercise: Tip Calculator | Page 73
在Product Name一欄輸入TipCalcualtor,Organization Name和Organization Identifier可以寫成你的姓名,之間不要有空格。最后,Language選擇Swift,Devices選擇iPhone,點擊Next(見圖3-8)。
接下來從左側選擇你要存放的文件夾,點擊Create,保存工程(見圖3-9)。
Page 74 | Chapter 3 : Diving into Swift
出現了工程的詳細信息界面(見圖3-10)。
Exercise: Tip Calculator | Page 75
點擊Project Navigator中的Main.storyboard文件(見圖3-11)。
我們這次開發的App僅限于在iPhone上使用,點擊Inspector的上方第一個按鈕,看起來像是一張紙折了一個角。到中間部分,不勾選Use Auto Layout選項。這時會出現一個對話框,選擇iPhone。然后不勾選Disable Size Classes(見圖3-12)。這時,Storyboard中的界面形狀會改變。我們將會在第七章詳細介紹Auto Layout的知識。
Page 76 | Chapter 3 : Diving into Swift
確保Inspector在屏幕的右方。如果沒有出現在屏幕右方,點擊Inspector View Button,就是右上角右邊有一條條紋的按鈕,這樣就可以顯示Inspector了。
Inspector下方有個小的工具欄按鈕,Object Library圖標(圓圈中有個小方塊)在圖3-13中藍色高亮了,如果你的Xcode這個圖標不是藍色,點擊一下這個圖標。
Exercise: Tip Calculator | Page 77
Object Library的下方有個搜索框,輸入Label(見圖3-14),Object Library搜索框能夠方便地找到我們需要的控件。在使用完畢后記得情況輸入框中的文字,不然你就看不到所有的控件了。
將一個Label控件拖入到界面中(見圖3-15)。借助輔助線讓Label水平居中且垂直居中。
Page 78 | Chapter 3 : Diving into Swift
看一下Inspector頂部的工具欄按鈕,點擊Attribute Inspector圖標,從左數第四個(見圖3-16),看起來像是一個朝下的箭頭。
在text屬性中輸入為$0.00,點擊回車。然后點擊center alignment按鈕(見圖3-17)。
再回到Inspector上方的工具欄,點擊從右往左第二個外表像是尺子的圖標來打開Size Inspector(見圖3-18)。Size Inspector可以設置控件具體位置。
Exercise: Tip Calculator | Page 79
寬設置為100,X值設置為110,Y值設置為200,這時注意界面中Label的位置已經發生了變化(見圖3-19)。點擊Attribute Inspector圖標。
Page 80 | Chapter 3 : Diving into Swift
接下來,我們要往界面上放一個Button。把鼠標光標移動到右下角,在Object Library找到Button控件(見圖3-20),把Button控件拖動到界面上。借助輔助線讓Button水平居中,放在Label的上方(見圖3-21)。
雙擊Button,輸入Calculate,回車。
Exercise: Tip Calculator | Page 81
接下來我們要添加一個Segmented Control(見圖3-22)。Segmented Control有點像是switch不過有更多選擇。Segmented Control可以在兩個或者更多的segments之前點擊切換,一次只能選擇一個segment。
在Object Library中找到Segmented Control,然后拖到界面上,把Segmented Control放到Button的上方(見圖3-23)。
Page 82 | Chapter 3 : Diving into Swift
選中Segmented Control,然后點擊Inspector上的Attribute Inspector,把Segments的數字修改為3(見圖3-24)。你會看到界面上的Segmented Control已經變成了3個(見圖3-25)。
接著雙擊Segmented Control上的First單詞,修改為15%,回車。雙擊Second修改為20%,雙擊第三個Segment,輸入25%(見圖3-26)。
Exercise: Tip Calculator | Page 83
最后需要添加的控件是Text Field,Text Field可以讓用戶通過敲擊鍵盤輸入東西。
到Object Library中找到Text Field(見圖3-27)。把Text Field拖到界面上,放到Segmented Control的上方(見圖3-28)。
Page 84 | Chapter 3 : Diving into Swift
點擊Attribute Inspector,找到Placeholder屬性,從上往下第五行。輸入Total Bill $(見圖3-29)。placeholder的文案有點像是向導,指導你在Text Field中輸入什么文字。
當用戶點擊Text Field時,placeholder中的文字會消失不見,然后鍵盤出現在屏幕上。
Exercise: Tip Calculator | Page 85
接下來在Inspector中找到Keyboard Type屬性,點擊Default右邊下拉按鈕,選擇Decimal Pad(見圖3-30)。這樣,彈出的鍵盤就只有數字了,用戶不需要在這里輸入字母。
現在界面已經搭建完畢了,那么接下來需要我們把界面view和conroller(就是swift文件)連起來了。和上一章節中的練習一樣,我們會用到Assistant Editor,來連接view和controller。
在屏幕的右上角,點擊Assistant Editor按鈕(見圖3-31)。打開Assistant Editor后,點擊Inspector View按鈕,讓Editor的空間更大一些(見圖3-32)。
Page 86 | Chapter 3 : Diving into Swift
?Assistant Editor會自動打開ViewController.swift文件,Assistant Editor上方在“Automatic”右邊會有文件名稱,核對一下是否是ViewController.swift。
選中界面上的Text Field控件,同時按住Control鍵,將Text Field控件拖到右邊ViewController.swift文件中下面這行代碼的下方:
class ViewController: UIViewController {
當你看到一條藍色的橫線時,然后松開鼠標(見圖3-33),接著出現一個彈出框(見圖3-34)。
Exercise: Tip Calculator | Page 87
因為你要獲取Text Field中用戶輸入的數值,所以我們使用Outlet連接類型。在Name一欄中輸入billTextField作為變量名,其余不變,點擊Connect完成連接。
當你點擊Connect后會產生一行代碼(見圖3-35)。看一下這行代碼:
@IBOutlet var billTextField : UITextField!
Page 88 | Chapter 3 : Diving into Swift
我們先跳過第一個單詞,過會再來討論它。先看一下var這個單詞,var用來聲明變量,billTextField是這個變量的名字,冒號用來聲明這個變量的類型,UITextField就是這個變量的類型。最后,@IBOutlet這個次用來表示這是view和controller之間的一個outlet連接。billTextField這個變量在代碼就代表界面上的這個Text Field控件。
選中Segmented Control控件,同時按住Control鍵,然后拖到右邊ViewController.swift文件中下面這行代碼的下方:
class ViewController: UIViewController {
當你看到一條藍色的橫線時,然后松開鼠標(見圖3-36),接著出現一個彈出框(見圖3-37)。
Exercise: Tip Calculator | Page 89
將Connection設置為Outlet,Name是tipRateSegmentedControl。剩下的選項不變,然后點擊Connect。
接下來選中界面上的Label控件,同時按住Control鍵,然后拖到右邊ViewController.swift文件中下面這行代碼的下方:
class ViewController: UIViewController {
當你看到一條藍色的橫線時,然后松開鼠標(見圖3-38),接著出現一個彈出框(見圖3-39)。
Page 90 | Chapter 3 : Diving into Swift
將Connection設置為Outlet,Name是tipLabel,剩下的選項不變,然后點擊Connect。
最后,選中界面上的Button控件,同時按住Control鍵,然后拖到右邊ViewController.swift文件中下面這行代碼的下方:
class ViewController: UIViewController {
當你看到一條藍色的橫線時,然后松開鼠標(見圖3-40),接著出現一個彈出框(見圖3-41)。
Exercise: Tip Calculator | Page 91
將Connection設置為Action,Name是calculateTapped。剩下的選項不變,然后點擊Connect。
你添加到ViewController.swift中的代碼會是下面這個樣子:
@IBOutlet var tipLabel : UILabel!
@IBOutlet var tipRateSegmentedControl : UISegmentedControl!
@IBOutlet var billTextField : UITextField!
@IBAction func calculateTapped(sender : AnyObject) {
}
Page 92 | Chapter 3 : Diving into Swift
calculateTapped action會自動添加一個方法,每次用戶點擊Button時,這個方法都會被調用。把你的鼠標光標放到這個方法的兩個大括號之間。
按照最佳實踐原則,我們需要寫注釋,說明你在接下來的代碼中將要完成哪些事情。這個過程,就做pseudocoding(偽代碼),能夠讓你在寫一個方法之前有一個大概的輪廓。你可以直接在Xcode中寫注釋,注釋還可以幫助其他程序員看懂你的代碼。當運行App或者編譯代碼時,我們是看不到注釋的。
前面先寫兩個斜杠,后面的文字就是注釋了。例如:
@IBAction func calculateTapped(sender : AnyObject) {
//This code is run each time the Calculate Button is tapped.
}
在calculateTapped方法中添加下面的注釋:
@IBAction func calculateTapped(sender : AnyObject) {
//1. 獲取賬單的總金額
//2. 確定小費費率
//3. 計算小費金額
//4. 將消費金額呈現給用戶
}
接下來,需要確定費率:15%,20%或25%。確定下費率后,總金額乘以費率,就是小費金額,然后將消費金額呈現給用戶。
現在你已經給方法大體規劃了計劃,那么我們需要為每一步編寫代碼了。
想要獲得總金額,使用要使用Text Field控件變量billTextField的text屬性。把鼠標光標放到第一行注釋的后面,按回車。接著輸入下面的代碼:
var userInput = billTextField!.text
(注意,作者寫這本書的時候swift2.0還沒有出來,現在NSString和String合二為一了,蘋果官方推薦使用String,不再推薦使用NSString了)
你可以注意到了,在你輸入代碼的時候,Xcode會提供一些單詞來幫助你寫代碼,例如,從billTextField中刪除“.text”,然后只輸入“.”。
這種預測輸入系統叫做Autocomplete(自動補全)。自動補全極大的提高了開發者的體驗,自動補全彈出框會顯示此變量所有可用的屬性和方法。
Exercise: Tip Calculator | Page 93
在billTextField.后面在輸入te兩個字母,自動補全就會更新可用屬性,甚至會顯示text屬性返回一個字符串,點擊Tab鍵接受自動補全。
現在你已經獲取了Text Field控件中的text,然而,text是一個字符串格式,不是數值,無法進行數學計算,我們需要把text的字符串類型轉換為Float類型。Float是帶有小數點的數字,Float類型特別適合處理貨幣計算。轉換類型的代碼如下:
var totalBill: Float = userInput.floatValue
這行代碼創建了一個新的變量totalBill,然后設置類型為float。同時,把用戶輸入的字符串轉換為浮點型然后賦值給了totalBill變量,使用的floatValue
方法。第一步完成了。
接下來是確定小費費率,要檢測用戶選擇的segments三個選項中哪一個,這樣就確定了費率。Segmented Control有個屬性是selectedSegmentIndex,這個屬性能夠告訴你用戶現在選中的是哪個segment。在第二個注釋后面按回車然后添加下列代碼:
var index: Int = tipRateSegmentedControl.selectedSegmentIndex
這行代碼創建了一個叫做index的新變量,同時把tipRateSegmentedControl選中的那個segment的值賦值給了index變量。index以零開頭,index 0就是15%,index 1就是20%,index 2就是25%.
現在你已經知道了選中了哪個segment,你需要根據選中的segment得到對應的費率,這個地方適合用if條件句,在你寫if條件句之前,先創建一個變量存儲當前的費率:
var tipRate: Float = 0.15
這行代碼創建一個浮點型變量tipRate。tipRate的默認值為0.15,tipRate會根據不同的segment轉換不同的費率。在代碼中寫下下面的if語句:
var tipRate: Float = 0.15
if index==0 {
tipRate = 0.15
}
Page 94 | Chapter 3 : Diving into Swift
if條件句用if開頭,接下來跟著條件。在這里,條件就是檢查index的值是否是0,如果是0,那么返回true,如果不是0,返回false。如果條件為true,那么兩個大括號直接的代碼就會被執行,否則會跳過大括號里的代碼,執行下一個條件。給if語句增加else if:
var tipRate: Float = 0.15
if index==0 {
tipRate = 0.15
} else if index==1 {
tipRate = 0.20
}
else if檢查另外的條件,如果index是0,那么else if語句就不會執行,else if檢查index的值是不是1,如果是1則為true,就會把0.20賦值給tipRate。增加if語句最后一部分:
var tipRate: Float = 0.15
if index==0 {
tipRate = 0.15
} else if index==1 {
tipRate = 0.20
} else {
tipRate = 0.25
}
最后這部分,你添加了else語句,如果前兩個if條件都不符合,那么就會觸發else語句。在這里,index的值只有三種可能:0,1,2。else處理的是如果index為2的條件。
現在你已經有了總金額和小費費率,可以進行計算了。把你的鼠標光標放到第三行注釋后面按回車,寫下下列代碼:
var tip: Float = totalBill * tipRate
這行代碼創建了名為tip的浮點型變量,totalBill乘以tipRate后的值賦值給tip。這樣,我們就完成了第三步。
把鼠標光標放到第四行注釋后面按回車,然后輸入下方的代碼:
tipLabel.text = "$\\(tip)"
這行代碼設置了tipLabel的text屬性,我們用雙引號來創建新的字符串,在字符串里面,先放一個美元的貨幣符合,然后\()這部分是起著占位符的作用,可以存放任何變量,在這里,占位符中是tip變量。
這時點擊Xcode的Play按鈕(或者Command+R),iOS模擬器就會啟動然后運行程序,App啟動后,點擊Text Field,輸入一個數字,然后選擇一個費率,點擊Calculate按鈕,Label中就會出現你需要付出的小費金額。
Exercise: Tip Calculator | Page 95
如果App沒有按照你想要的結果運行,或者程序有了錯誤或警告,不要太擔心,學習的最佳方式就是試錯,熟能生巧,到我們的網站上下載示例代碼,對比一下代碼,多試幾次,直到搞定這個程序為止。
Page 96 | Chapter 3 : Diving into Swift