氣象人
氣象人(The Weather Man)是一部我很喜歡的電影,由當年正紅的尼可拉斯凱吉主演,雖然尼可現在已經過氣,但當年他主演過很多好片。
之所以喜歡這部電影是因為它的劇情真實反映了人生很多事,以及無奈。希望大家有空可以欣賞一下,我這邊就不透露劇情,只節錄電影中最令我有感覺的一句台詞:The shit life, we must chuck somethings. We must chuck them, in the shit life. 中文意思是:在人生坎坷的旅途中,一定要有所放棄,因為人生坎坷。當時聽到這句話真的快落淚了。
閒話不多說,趕緊來介紹這個App。簡單講,你可以用這個App查詢全國22個縣市一週內的天氣。因為我利用解析JSON的方式,抓取了台北市政府關於一週氣象預測的Open Data。執行動畫如下:
擷取畫面如下:
UI沒有特別美化,因為時間實在不多,我把重點擺在功能完成上。就像氣象人電影說的,we must chuck somethings. we must chuck them…
本App用到的關鍵技術如下:
- 解析JSON資料
- 用程式開啟下一個頁面以及回到首頁
- 用程式傳遞資料到下一個頁面
關鍵程式碼在此:
@IBAction func button_cityselection(_ sender: UIButton) {
var date = [String]()
var weather = [String]()
var city: String = “”
switch sender {
case button_city[0]:
city = “臺北市”
case button_city[1]:
city = “新北市”
case button_city[2]:
city = “桃園市”
case button_city[3]:
city = “臺中市”
case button_city[4]:
city = “臺南市”
case button_city[5]:
city = “高雄市”
case button_city[6]:
city = “基隆市”
case button_city[7]:
city = “新竹縣”
case button_city[8]:
city = “新竹市”
case button_city[9]:
city = “苗栗縣”
case button_city[10]:
city = “彰化縣”
case button_city[11]:
city = “南投縣”
case button_city[12]:
city = “雲林縣”
case button_city[13]:
city = “嘉義縣”
case button_city[14]:
city = “嘉義市”
case button_city[15]:
city = “屏東縣”
case button_city[16]:
city = “宜蘭縣”
case button_city[17]:
city = “花蓮縣”
case button_city[18]:
city = “臺東縣”
case button_city[19]:
city = “澎湖縣”
case button_city[20]:
city = “金門縣”
case button_city[21]:
city = “連江縣”
default:
break
}
let urlStr = “http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=e6831708-02b4-4ef8-98fa-4b4ce53459d9"
if let url = URL(string: urlStr) {
let task = URLSession.shared.dataTask(with: url) { (data, response , error) in
if let data = data, let dic = try?
JSONSerialization.jsonObject(with: data) as? [String: Any], let result1 = dic?[“result”] as? [String: Any], let result2 = result1[“results”] as? [[String: Any]]{
for location in result2 {
let id = location[“_id”] as! String
let city_t = location[“locationName”] as! String
let weather_t = location[“parameterName1”] as! String
let date_t = location[“startTime”] as! String
if (Int(id)! % 2 == 0) && city_t == city {
date.append(String(date_t.prefix(10)))
weather.append(String(weather_t))
}
}
}
}
task.resume()
}
while date.count != 7 {
}
if let controller = storyboard?.instantiateViewController(withIdentifier: “weathertableview”) as? WeatherTableViewController {
for i in 0…6 {
controller.date.append(date[i])
controller.weather.append(weather[i])
}
present(controller, animated: true, completion: nil)
}
}
GitHub在這:
這次覺得最困難的部分就是讀懂dataTask程式的寫法,光是這部分真的卡關卡很久,只能說Swift還蠻多眉角的。其實我之前就有個夢想,想寫一個App可以統合所有政府機關的Open Data,然後利用大數據的分析,從中找出一些關鍵的、有價值的資訊,這次學會了解析JSON的技術真的很開心,感謝彼得潘。大家也可以拿這個App和iPhone內建的天氣App比看看誰的比較準喔~~XD