#HW 猜數字 App & 1A2B,struct&extension應用

雖然是第一次聽到1A2B的遊戲,不過好像是有很長的歷史了,遊戲規則主要是一個四位數的不重複亂數,讓使用者去猜,A的條件是有這個數字且位置正確,B則是有這個數字,但位置不對,比如說亂數1487,使用者猜6419,結果應該是1A1B。

1.首先要解決亂數的問題

var number = Int.random(in: 0 … 9)產生0~9

產生亂數很簡單,只是要去思考產生不重複的亂數的話,總共有四個位置要產生,每個都是0~9產生,如果重複的話不產生,一開始想的時候產生出一個數字再去判斷下次產生是否重複,如果不重複繼續產生,但後來發現這樣比對第二次第三次還要重複回去跟前面的重複產生,程式碼也感覺很複雜,所以決定放棄這個方式

換另一個思考模式,先宣告一個陣列裡面存0~9,因為索引值跟我存的東西剛好一樣,於是我只要寫一個迴圈每產生一次,就把陣列裡的東西拿出來丟到另一個新的陣列,來確定他不會重複。

朝著這個方向去想好像就很簡單了,而且每次產生的亂數是用array.count的數量去產生,所以不用擔心會取不到數字的問題

如此一來我的newArray即可保證不重複產生亂數,先在playground練習一下

2.使用者輸入數字

思考的方向,使用者輸入的東西,是否有輸入->是否空字串 ->是否是數字->是否四位數->存進陣列

guard先做optional binding 跟空字串的問題

如果可以轉換成數字,接下來要處理存進幾位數,四位數不處理,利用%的計算取餘數。

let thousand = (X — X%1000) /1000

如果輸入的X為123456,那麼我的thousand就會等於123所以這個時候可以去判斷我只要四個數字的話,意思是我的thousand<10才要繼續,並且可以確認接下來的數字不會超過四位數。

如果≥10的話表示超過四位數印出,錯誤

如果小於10那接下來依序取的百位十位個位,並存入陣列中

print只是方便好測試,之後要改成label.text顯示在螢幕上

寫到這裡上網查了,好像不需要這麼辛苦設定這些判斷,UITextField提供驗證輸入的字串方法,要去服從UITextFieldDelegate去實作下面這個方法

裡面要去有三個內部參數可以使用

textField.text:原本文字輸入匡文字得值

rang.length:即將要刪除的

string:即將輸入的

假如我輸入1234的結果print出來

三個變量去計算輸入完後textField還剩幾個數字,判斷如果>4就回傳false,變成無法輸入,其餘則return true,整個改寫一下程式碼,加了次數的判定在最外層,有興趣的可以直接看下方的連結

3.struct

剛好Peter有提到這部分問了他的,然後自己再去研究一下,發現這樣寫真的蠻方便的

我把大部分自己宣告的常數變數陣列都放在另一個檔案,裡面設定一個struct,放置我宣告的常數變數陣列,警告控制器,亂數產生方法,以及動畫的設定,只要想使用宣告一個變數存取這個struct物件就可以取用裡面的東西。

4.extension

去擴展extsion UIAlertController,然後把我的每個UIAlertController,都存在struct檔,這樣我要使用這個物件的時候就只需要present出來就好

中間其實有蠻多細節的部分,不過我想這個作業最大的困難大概是界面吧,完全不知道如何設計才好,只好參考其他的人作品,成果如下

--

--

Drake
彼得潘的 Swift iOS / Flutter App 開發教室

2018/06/04 記錄自己前往成為開發者的道路,以及自己的學習筆記。