氣象人續集

尼可拉斯凱吉沒有演氣象人續集,但我有。繼氣象人第一集獲得好評(120個claps)後,決定再向登峰造極挑戰。這次我在氣象人App新增了以下功能:

  1. 文字描述氣象改成圖案描述。(目不識丁也可以使用)
  2. 增加當日最高溫與最低溫。(了解氣候就像人情有冷暖)
  3. 用星期幾代替年月日。(我們更在意今天星期幾勝於今天幾月幾日,尤其今天是否是星期五至關重要)

若你沒follow第一集請看這個:

執行動畫如下:

截圖如下:

GitHub如下:

使用到的主要技術如下:

  1. 用Decoder和Codable的方式解析JSON資料,主要程式碼如下:

override func viewDidLoad() {

super.viewDidLoad()

label_city.text = self.city

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

let decoder = JSONDecoder()

decoder.dateDecodingStrategy = .iso8601

if let data = data, let weather = try? decoder.decode(Weather.self, from: data) {

DispatchQueue.main.async {

var i = 0

for w in weather.result.results {

if w.locationName == self.city {

let weekday = Calendar.current.component(.weekday, from: w.startTime)

switch weekday {

case 1:

self.label_date[i].text = “星期日”

case 2:

self.label_date[i].text = “星期一”

case 3:

self.label_date[i].text = “星期二”

case 4:

self.label_date[i].text = “星期三”

case 5:

self.label_date[i].text = “星期四”

case 6:

self.label_date[i].text = “星期五”

case 7:

self.label_date[i].text = “星期六”

default:

break

}

if (i > 0) && (self.label_date[i].text == self.label_date[i-1].text) {

continue

}

switch w.parameterName1 {

case “多雲時陰短暫陣雨或雷雨”:

self.image_weather[i].image = UIImage(named: “多雲時陰短暫陣雨或雷雨”)

case “陰時多雲短暫陣雨或雷雨”:

self.image_weather[i].image = UIImage(named: “多雲時陰短暫陣雨或雷雨”)

case “多雲時陰陣雨或雷雨”:

self.image_weather[i].image = UIImage(named: “多雲時陰短暫陣雨或雷雨”)

case “多雲短暫陣雨或雷雨”:

self.image_weather[i].image = UIImage(named: “多雲時陰短暫陣雨或雷雨”)

case “陰短暫陣雨或雷雨”:

self.image_weather[i].image = UIImage(named: “多雲時陰短暫陣雨或雷雨”)

case “陰時多雲陣雨或雷雨”:

self.image_weather[i].image = UIImage(named: “多雲時陰短暫陣雨或雷雨”)

case “多雲短暫陣雨”:

self.image_weather[i].image = UIImage(named: “多雲時陰短暫陣雨或雷雨”)

case “晴午後短暫雷陣雨”:

self.image_weather[i].image = UIImage(named: “多雲時陰短暫陣雨或雷雨”)

case “陰時多雲”:

self.image_weather[i].image = UIImage(named: “陰時多雲”)

case “陰天”:

self.image_weather[i].image = UIImage(named: “陰時多雲”)

case “晴時多雲”:

self.image_weather[i].image = UIImage(named: “晴時多雲”)

case “多雲”:

self.image_weather[i].image = UIImage(named: “多雲”)

case “陰陣雨或雷雨”:

self.image_weather[i].image = UIImage(named: “雷雨”)

default:

self.image_weather[i].image = UIImage(named: “晴”)

}

self.label_temph[i].text = w.parameterName2

self.label_templ[i].text = w.parameterName3

i = i + 1

if i == 7 {

break

}

}

}

}

}

}

task.resume()

}

2. 實作TableView的cell被touch的action,主要程式碼如下:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

var city: String = “”

switch indexPath.row {

case 1:

city = “臺北市”

case 2:

city = “新北市”

case 3:

city = “桃園市”

case 4:

city = “臺中市”

case 5:

city = “臺南市”

case 6:

city = “高雄市”

case 7:

city = “基隆市”

case 8:

city = “新竹縣”

case 9:

city = “新竹市”

case 10:

city = “苗栗縣”

case 11:

city = “彰化縣”

case 12:

city = “南投縣”

case 13:

city = “雲林縣”

case 14:

city = “嘉義縣”

case 15:

city = “嘉義市”

case 16:

city = “屏東縣”

case 17:

city = “宜蘭縣”

case 18:

city = “花蓮縣”

case 19:

city = “臺東縣”

case 20:

city = “澎湖縣”

case 21:

city = “金門縣”

case 22:

city = “連江縣”

default:

break

}

if let controller = storyboard?.instantiateViewController(withIdentifier: “weathertableview”) as? WeatherTableViewController {

controller.city = city

present(controller, animated: true, completion: nil)

}

}

3. 使用Dispatchmainqueue在 main thread執⾏ UI 相關的程式。

心得感想:

  1. 上一集的氣象人App我並沒有實作TableView的cell被touch的action,而是直接在每個cell放了button,用button的action寫程式。所以這次實作cell被touch的action就需要把所有button移除,在每個cell重新放入Label,然後再對每個Label寫上城市名,總共22個,花了一些時間,這時發現台灣真的很大,有22個主要行政區。
  2. 看到台南市的天氣聯想到這次水災,真心為南部人,為台灣祈福。
  3. 要針對每種氣象文字描述搭配不同的圖案真的不容易,主要是因為我們的氣象文字描述實在有太多相似,很多用語看起來很像是同一個意思,結果卻分成那麼多種。舉例來說,大家知道這幾個氣象描述有什麼不同嗎?

(1) 多雲時陰短暫陣雨或雷雨

(2) 陰時多雲短暫陣雨或雷雨

(3) 多雲時陰陣雨或雷雨

(4) 多雲短暫陣雨或雷雨

(5) 陰短暫陣雨或雷雨

(6) 陰時多雲陣雨或雷雨

(7) 多雲短暫陣雨

我是不懂有什麼不同,但我還是得在程式裡為每一個描述做判斷來設定圖案。

4. 今天是最後一堂課,我想就拿這個當作期末demo的App吧!本來想做梭哈、西洋棋來demo的,但那個要做到可以玩也可以demo可能要到年底吧!XD 還是來一句氣象人的電影經典名言來做結尾:Nothing that has meaning is easy. Easy doesn’t enter into grown-up life. 中文意思是:有意義的事絕不會是輕而易舉的。成人世界中,更沒有輕而易舉的事。學習設計iOS App兩個月下來,真的體會要精通這門技術且完成一個可以上架賺錢的App,真的不是輕而易舉的事啊!