#63 IBSegueAction 練習 — 計算生命靈數

Timmy-Luo
8 min readAug 9, 2021

--

生命靈數計算方式:

生日西元年月日每個位數相加,如得出二位數,此兩數再相加(如仍是二位數就再相加),直到成為個位數字。

ex:1996/02/13,1+9+9+6+0+2+1+3=31,3+1=4

生命靈數=4

LifeNumberViewController 建立 IBOutlet

建立兩個 ViewController,LifeNumberViewController 為選擇日期的 UIDatePicker、顯示星座圖案的 UIImageView、顯示當前星座、年齡的 UILabel

func constellation()

設定星座的日期區間、顯示星座和對應的照片

使用 Calendar.current.dateComponents(in: from: ) 取值

func constellation() {    //選取日期    let pickDate = constellationDatePicker.date    let dateComponents = Calendar.current.dateComponents(in:
TimeZone.current, from: pickDate)
let year = dateComponents.year! let month = dateComponents.month! let day = dateComponents.day! //取現在日期 let today = Date() let currentDateComponents = Calendar.current.dateComponents(in:
TimeZone.current, from: today)
let currentYear = currentDateComponents.year! var age = 0 //計算當前年紀 age = currentYear - year //年紀不出現負數 if age < 0 { age = 0 } ageLabel.text = "您目前 \(age) 歲"
//設定星座的日期區間、顯示星座和對應的照片 if month == 1 && day >= 19 || month == 2 && day <= 19 { starLabel.text = "水瓶座" starImageView.image = UIImage(named: "10") } else if month == 2 && day >= 20 || month == 3 && day <= 20 { starLabel.text = "雙魚座" starImageView.image = UIImage(named: "11") } else if month == 3 && day >= 21 || month == 4 && day <= 20 { starLabel.text = "牡羊座" starImageView.image = UIImage(named: "00") } else if month == 4 && day >= 21 || month == 5 && day <= 20 { starLabel.text = "金牛座" starImageView.image = UIImage(named: "01") } else if month == 5 && day >= 21 || month == 6 && day <= 20 { starLabel.text = "雙子座" starImageView.image = UIImage(named: "02") } else if month == 6 && day >= 21 || month == 7 && day <= 22 { starLabel.text = "巨蟹" starImageView.image = UIImage(named: "03") } else if month == 7 && day >= 23 || month == 8 && day <= 22 { starLabel.text = "獅子座" starImageView.image = UIImage(named: "04") } else if month == 8 && day >= 23 || month == 9 && day <= 22 { starLabel.text = "處女座" starImageView.image = UIImage(named: "05") } else if month == 9 && day >= 23 || month == 10 && day <= 22 { starLabel.text = "天秤座" starImageView.image = UIImage(named: "06") } else if month == 10 && day >= 23 || month == 11 && day <= 22 { starLabel.text = "天蠍座" starImageView.image = UIImage(named: "07") } else if month == 11 && day >= 23 || month == 12 && day <= 22 { starLabel.text = "射手座" starImageView.image = UIImage(named: "08") } else { starLabel.text = "摩羯座" starImageView.image = UIImage(named: "09") }}

ResultViewController 建立 IBOutlet

ResultViewController 為顯示網頁的 webView

⚠️貼心提醒,記得 import WebKit

func calculateLifeNumber(date: Date) -> Int

計算生命靈數

使用 DateFormatter 日期轉字串

計算生命靈數:
將選擇的日期數字轉成字串,進入迴圈後將日期字串轉成數字求個數的總和,求完字數總和數字轉成字串判斷總和是否為<=9,如果大於 9 ,就回 repeat 再執行一次。

func calculateLifeNumber(date: Date) -> Int {    let dateFormatter = DateFormatter()    dateFormatter.dateFormat = "yMd"    var numberString = dateFormatter.string(from: date)    var sum = 0    repeat {        sum = 0        for character in numberString {            let number = Int(String(character))!            sum = sum + number        }        numberString = "\(sum)"    } while sum > 9    return sum}

Repeat-While

Repeat-While 在其他程式中可能又叫座 Do-While,然而跟 While 最大的不同就是,Repeat-While 無論如何都會先執行一次要被執行的程式碼,執行完之後才會進行條件檢查

日期相加,如果讀出二位數,即二位數再相加至個位數。repeat {    
日期總和 = 0
for_in 日期字串 {
將日期轉數字,取日期數字總和
}
日期總和轉 日期字串(日期總和 <= 9,則不用跑 while)
} while 日期總和 > 9,回至repeat開始

func updateUI()

連接網頁

func updateUI() {
let number = calculateLifeNumber(date: lifeNumber)
title = "\(number) \(lifeNumberNames[number])數"
if let url = URL(string: "https://www.ifreesite.com/numerology/a
(number).htm") {
let request = URLRequest(url: url)
lifeNumberWebView.load(request)
}
}

--

--