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

Jie Liang Huang
Sep 1, 2018 · 6 min read

雖然是第一次聽到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出來就好

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

彼得潘的 Swift iOS App 開發教室

學習 Swift iOS App 開發的學生作品集

    Jie Liang Huang

    Written by

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

    彼得潘的 Swift iOS App 開發教室

    學習 Swift iOS App 開發的學生作品集

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade