編寫一個小費計算器App吧~第三章練習Tip Calculator

練習:Tip Calculator 小費計算器

下一個App可以幫助用戶計算他們每次去餐廳吃飯時應該付多少錢給服務員嗎,用戶輸入總消費額,然后從3個費率:15%,20%和25%中挑一個費率,用戶點擊計算按鈕,消費數額就會出現在屏幕上。App完成版本的效果圖如下(見圖3-5):

圖3-5 最終App的樣子

Exercise: Tip Calculator | Page 71

現在你知道了App有哪些功能,那么打開Xcode吧,點擊Dock中的Xcode圖標,如果Dock中沒有Xcode,那么去Spotlight中搜索一下。

接著會出現熟悉的Xcode歡迎界面。關閉歡迎界面,點擊頂部菜單欄的File -> New -> Project(見圖3-6)。

圖3-6 新工程New project

Page 72 | Chapter 3 : Diving into Swift

從模板中選擇Single View Application,點擊Next(見圖3-7)。

圖3-7

Project的一些項目可能已經自動為你填寫好了。

Exercise: Tip Calculator | Page 73

在Product Name一欄輸入TipCalcualtor,Organization Name和Organization Identifier可以寫成你的姓名,之間不要有空格。最后,Language選擇Swift,Devices選擇iPhone,點擊Next(見圖3-8)。

圖3-8

接下來從左側選擇你要存放的文件夾,點擊Create,保存工程(見圖3-9)。

圖3-9

Page 74 | Chapter 3 : Diving into Swift

出現了工程的詳細信息界面(見圖3-10)。

圖3-10

Exercise: Tip Calculator | Page 75

點擊Project Navigator中的Main.storyboard文件(見圖3-11)。

圖3-11 Main.storyboard

我們這次開發的App僅限于在iPhone上使用,點擊Inspector的上方第一個按鈕,看起來像是一張紙折了一個角。到中間部分,不勾選Use Auto Layout選項。這時會出現一個對話框,選擇iPhone。然后不勾選Disable Size Classes(見圖3-12)。這時,Storyboard中的界面形狀會改變。我們將會在第七章詳細介紹Auto Layout的知識。

圖3-12

Page 76 | Chapter 3 : Diving into Swift

確保Inspector在屏幕的右方。如果沒有出現在屏幕右方,點擊Inspector View Button,就是右上角右邊有一條條紋的按鈕,這樣就可以顯示Inspector了。

Inspector下方有個小的工具欄按鈕,Object Library圖標(圓圈中有個小方塊)在圖3-13中藍色高亮了,如果你的Xcode這個圖標不是藍色,點擊一下這個圖標。

圖3-13 Object Library

Exercise: Tip Calculator | Page 77

Object Library的下方有個搜索框,輸入Label(見圖3-14),Object Library搜索框能夠方便地找到我們需要的控件。在使用完畢后記得情況輸入框中的文字,不然你就看不到所有的控件了。

圖3-14

將一個Label控件拖入到界面中(見圖3-15)。借助輔助線讓Label水平居中且垂直居中。

圖3-15

Page 78 | Chapter 3 : Diving into Swift

看一下Inspector頂部的工具欄按鈕,點擊Attribute Inspector圖標,從左數第四個(見圖3-16),看起來像是一個朝下的箭頭。

圖3-16 Attribute Inspector icon

在text屬性中輸入為$0.00,點擊回車。然后點擊center alignment按鈕(見圖3-17)。

圖3-17

再回到Inspector上方的工具欄,點擊從右往左第二個外表像是尺子的圖標來打開Size Inspector(見圖3-18)。Size Inspector可以設置控件具體位置。

圖3-18

Exercise: Tip Calculator | Page 79

寬設置為100,X值設置為110,Y值設置為200,這時注意界面中Label的位置已經發生了變化(見圖3-19)。點擊Attribute Inspector圖標。

圖3-19

Page 80 | Chapter 3 : Diving into Swift

接下來,我們要往界面上放一個Button。把鼠標光標移動到右下角,在Object Library找到Button控件(見圖3-20),把Button控件拖動到界面上。借助輔助線讓Button水平居中,放在Label的上方(見圖3-21)。

圖3-20
圖3-21

雙擊Button,輸入Calculate,回車。

Exercise: Tip Calculator | Page 81

接下來我們要添加一個Segmented Control(見圖3-22)。Segmented Control有點像是switch不過有更多選擇。Segmented Control可以在兩個或者更多的segments之前點擊切換,一次只能選擇一個segment。

圖3-22 Object Library中的Segmented Control

在Object Library中找到Segmented Control,然后拖到界面上,把Segmented Control放到Button的上方(見圖3-23)。

圖3-23

Page 82 | Chapter 3 : Diving into Swift

選中Segmented Control,然后點擊Inspector上的Attribute Inspector,把Segments的數字修改為3(見圖3-24)。你會看到界面上的Segmented Control已經變成了3個(見圖3-25)。

圖3-24
圖3-25

接著雙擊Segmented Control上的First單詞,修改為15%,回車。雙擊Second修改為20%,雙擊第三個Segment,輸入25%(見圖3-26)。

圖3-26

Exercise: Tip Calculator | Page 83

最后需要添加的控件是Text Field,Text Field可以讓用戶通過敲擊鍵盤輸入東西。

到Object Library中找到Text Field(見圖3-27)。把Text Field拖到界面上,放到Segmented Control的上方(見圖3-28)。

圖3-27
圖3-28

Page 84 | Chapter 3 : Diving into Swift

點擊Attribute Inspector,找到Placeholder屬性,從上往下第五行。輸入Total Bill $(見圖3-29)。placeholder的文案有點像是向導,指導你在Text Field中輸入什么文字。

圖3-29

當用戶點擊Text Field時,placeholder中的文字會消失不見,然后鍵盤出現在屏幕上。

Exercise: Tip Calculator | Page 85

接下來在Inspector中找到Keyboard Type屬性,點擊Default右邊下拉按鈕,選擇Decimal Pad(見圖3-30)。這樣,彈出的鍵盤就只有數字了,用戶不需要在這里輸入字母。

圖3-30

現在界面已經搭建完畢了,那么接下來需要我們把界面view和conroller(就是swift文件)連起來了。和上一章節中的練習一樣,我們會用到Assistant Editor,來連接view和controller。

在屏幕的右上角,點擊Assistant Editor按鈕(見圖3-31)。打開Assistant Editor后,點擊Inspector View按鈕,讓Editor的空間更大一些(見圖3-32)。

圖3-31 Assistant Editor按鈕
圖3-32 隱藏Inspector

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)。

圖3-33
圖3-34

Exercise: Tip Calculator | Page 87

因為你要獲取Text Field中用戶輸入的數值,所以我們使用Outlet連接類型。在Name一欄中輸入billTextField作為變量名,其余不變,點擊Connect完成連接。

當你點擊Connect后會產生一行代碼(見圖3-35)。看一下這行代碼:

@IBOutlet var billTextField : UITextField!
圖3-35

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)。

圖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)。

圖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)。

圖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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容