概述
日期: 2017-02-08
項(xiàng)目: 知天氣(中級(jí)版)
學(xué)到了什么:
typealias 的概念
用多線程和閉包優(yōu)化代碼
詳情
概念:typealias
typealias,alias 這個(gè)詞根是「化名」的意思,所以 typealias 可以理解成「給類起個(gè)昵稱」。
那為什么要給類起個(gè)名字呢?
在 Swift 里面,函數(shù)(function)和閉包(closure)都是一個(gè)類(type),那么在函數(shù)套閉包,閉包套函數(shù)的時(shí)候,看起來就非常地不友好。
拿《知天氣》這個(gè)項(xiàng)目來舉例,有一個(gè)需求是:把所選城市對(duì)應(yīng)的字符串(String)傳入函數(shù),拼接成一個(gè)可以獲取數(shù)據(jù)的網(wǎng)址(URL),解析之后獲得天氣信息。在這個(gè)過程里,需要傳進(jìn)一個(gè)參數(shù)(城市名稱),并且要用閉包回調(diào)解析出來的數(shù)據(jù)。那么這個(gè)函數(shù)名就要這樣寫:
func loadData(_ cityName: String, completion: @escaping (_ result: Weather)->()) -> (){
// function
}
那么多的小括號(hào)其實(shí)是很崩潰的。這個(gè)時(shí)候就可以給 completion 這個(gè)閉包,起一個(gè)名字,像這樣:
typealias WeatherDataCompletionBlock = (_ data: Weather?) -> ()
func loadData (_ cityName: String, completion: @escaping WeatherDataCompletionBlock) {
// function
}
雖然代碼行數(shù)變多了,但是顯然易讀了許多。
技巧:
Use of instance member 'getCurrentWeather' on type 'WeatherService'; did you mean to use a value of type 'WeatherService' instead?
一個(gè)報(bào)錯(cuò)信息。
也就是說,如果要調(diào)用實(shí)例方法(instance method),必須要調(diào)用這個(gè)類(class)里的實(shí)例。
比如說,創(chuàng)建了一個(gè) Weather 的實(shí)例,里面有一個(gè)方法叫做 getWeather,那么可以這樣調(diào)用這個(gè)方法:
let myWeather = Weahter()
myWeather.getWeather()
在 Weather 這個(gè)類里聲明函數(shù)的時(shí)候,也要加上 class 的關(guān)鍵字,像這樣:
class func getWeather(){
//function
}
不足:
依然有重復(fù)的代碼,具體在:
分別獲得實(shí)時(shí)天氣和預(yù)報(bào)的 API 之后,請(qǐng)求網(wǎng)絡(luò)時(shí)的一堆 guard 是一樣的,但是暫時(shí)沒有辦法處理。