struct Univ: Codable{
let webPage: [String]
let domains: [String]
let country: String
let name: String
let state: String?
let code: String
enum CodingKeys: String, CodingKey {
case webPage = "web_pages"
case domains
case country
case name
case state = "state-province"
case code = "alpha_two_code"
}
}
web_page와 domain은 [String]으로 state-province는 String?, 나머지는 String형으로 struct를 만들었다.
struct를 만들 때에 CodingKeys 부분을 추가하면 오류가 발생하였는데, 이건 도대체 이유를 모르겠지만 됐다..
Alamofire을 사용하여 API를 호출하였다.
import Alamofire
func fetchUnivList(completionHandler: @escaping(Result<[Univ], Error>) -> Void){
let url = "http://universities.hipolabs.com/search"
let param = ["country" : country]
AF.request(url, method: .get, parameters: param, encoding: URLEncoding.default, headers: ["Content-Type" : "application/json", "Accept" : "application/json"])
.responseData(completionHandler: {
response in
switch response.result{
case let .success(data):
do{
let decoder = JSONDecoder()
let result = try decoder.decode([Univ].self, from: data)
completionHandler(.success(result))
}
catch{
completionHandler(.failure(error))
}
case let .failure(error):
completionHandler(.failure(error))
}
})
}
Alamofire은 URLSession을 일일이 선언하여 사용하는 것을 보다 편하게 하기 위한 Framework이다.
참고:
JSON Decoder 사용 시 [Univ] 형태로 받아야 Parsing이 가능했다.
API를 TableView로 불러왔다. 하지만 많은 대학교를 일일이 찾아서 선택할 수는 없다.
그래서 UISearchController를 사용했다.
1. tableView와 searchController를 선언했다.
@IBOutlet weak var listTableView: UITableView!
let searchController = UISearchController(searchResultsController: nil)