#31 密碼安全性檢查
for in 迴圈,Array contains 屬性,練習
在現在的時代,我們每天都會接觸很多新的App,當你下載了一個新的 app,基本上都需要使用者註冊新的帳號。
使用者註冊時,必須設定帳號密碼。你希望你可以擁有安全的密碼,所以今天我們來練習然後做一個App來檢查我們設立的密碼是不是終極密碼,可以拒絕不安全的密碼。
建立密碼的規則如下,
- 至少 16 個字元。
2. 至少一個普通字母。
3. 至少一個數字。
4. 至少一個標點符號。
5. 至少包含一個大寫字母和一個小寫字母。
6. 不可以包含使用者名稱。
先看一下成果
步驟:
1. 先拉@IBAOutlet,這一次只有三個要拉,
暱稱跟密碼的UItextField,還有顯示結果的Label
這一次,因為要讓大家看到自己打的密碼,所以把密碼的UITexifield的 Secure Text entry 的勾去掉,這樣就可以看到了!
如果打鉤,就會看不到自己打的密碼,就會出現。。。。
檢查結果的Label,一開始是Hidden 打勾的,所以一開始是沒有顯示的。
2. 分析密碼:
密碼有3個部分組成
a. 26個英文字母,分大小寫。
b. 0~9 數字
c. 標點符號 包含“ !@#$%^&*(),.<>;’`~[]{}\\|/?_-+= ”
先把數字和標點符號宣告成一個常數, 以方便我們檢查。
let digits = "0123456789"let punctuation = "!@#$%^&*(),.<>;'`~[]{}\\|/?_-+= "
3. 建立條件
終極密碼建立規則裡,將不是字母的檢查先檢查完,就是至少 16 個字元和不可以包含使用者名稱
if password.text!.count < 16 {resultLabel.text = "密碼設定至少 16 個字元!"} else if password.text!.contains(username.text!) {resultLabel.text = "密碼設定不可以包含使用者名稱!"} else {
4. 建立迴圈檢查字母
檢查至少一個數字
至少一個標點符號 !@#$%^&*(),.<>;’`~[]{}\\|/?_-+=
至少一個普通字母
至少包含一個大寫字母和一個小寫字母
你不必檢查整組密碼,而是檢查密碼的每個字元。
回想先前學過的內容,字串的定義是字元序列。雖然 String 和 Array 是不同的類型,但兩者都是序列,也就是說兩者皆以特定順序排列元素。for…in 迴圈具有特殊的超能力:可適用於「任何」序列,不僅適用於陣列。
var numberOfDigits = 0var numberOfPunctuations = 0var numberOfRegularLetters = 0var numberOfUppercases = 0var numberOfLowercases = 0// 建立迴圈檢查每一個字母for character in password.text! {if digits.contains(character) {numberOfDigits += 1} else if punctuation.contains(character) {numberOfPunctuations += 1} else {numberOfRegularLetters += 1if character.isUppercase {numberOfUppercases += 1} else {numberOfLowercases += 1}}}
5. 將檢查結果顯示在resultLabel
if numberOfDigits == 0 {resultLabel.text = "密碼設定至少一個數字!"} else if numberOfPunctuations == 0 {resultLabel.text = "密碼設定至少一個標點符號!"} else if numberOfRegularLetters == 0 {resultLabel.text = "密碼設定至少包含字母!"} else if numberOfLowercases == 0 {resultLabel.text = "密碼設定至少包含一個小寫字母!"} else if numberOfUppercases == 0 {resultLabel.text = "密碼設定至少包含一個大寫字母!"} else {resultLabel.text = "恭喜你,終極密碼設定完成!"}
完整程式碼
import UIKitclass ViewController: UIViewController {@IBOutlet weak var username: UITextField!@IBOutlet weak var resultLabel: UILabel!@IBOutlet weak var password: UITextField!// 列出數字,標點符號let digits = "0123456789"let punctuation = "!@#$%^&*(),.<>;'`~[]{}\\|/?_-+= "override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view.}@IBAction func checkPassword(_ sender: UIButton) {resultLabel.isHidden = falseif password.text!.count < 16 {resultLabel.text = "密碼設定至少 16 個字元!"} else if password.text!.contains(username.text!) {resultLabel.text = "密碼設定不可以包含使用者名稱!"} else {var numberOfDigits = 0var numberOfPunctuations = 0var numberOfRegularLetters = 0var numberOfUppercases = 0var numberOfLowercases = 0// 建立迴圈檢查每一個字母for character in password.text! {if digits.contains(character) {numberOfDigits += 1} else if punctuation.contains(character) {numberOfPunctuations += 1} else {numberOfRegularLetters += 1if character.isUppercase {numberOfUppercases += 1} else {numberOfLowercases += 1}}}if numberOfDigits == 0 {resultLabel.text = "密碼設定至少一個數字!"} else if numberOfPunctuations == 0 {resultLabel.text = "密碼設定至少一個標點符號!"} else if numberOfRegularLetters == 0 {resultLabel.text = "密碼設定至少包含字母!"} else if numberOfLowercases == 0 {resultLabel.text = "密碼設定至少包含一個小寫字母!"} else if numberOfUppercases == 0 {resultLabel.text = "密碼設定至少包含一個大寫字母!"} else {resultLabel.text = "恭喜你,終極密碼設定完成!"}}}}
GitHub: