[iOS/Swift] Alamofire를 이용한 앱 구현(우편번호 검색 앱을 예로)
쓰기
Alamofire를 사용한 API 호출을 사용하여 앱 구현
쓴 이유
Alamofire를 이용한 API 호출 방법을 잊었을 때 확인
참고한 기사
표준과 Alamofire에서 API 호출 처리를 비교해 봅니다 (Swift)
위 기사에 소개 된 코드에 UI를 구현했습니다.
(굉장히 알기 쉬운 기사입니다)
전제 조건
Main.storyboard
에서 설정 ViewController.swift
에 연결됩니다.CocoaPods
를 사용하여 Alamofire
는 이미 도입되었습니다.앱 기능
텍스트 필드에 우편 번호를 입력하고 [Seach] 버튼을 탭하면 라벨 (밝은 색)에 해당 우편 번호에 해당하는 주소가 표시됩니다.
・우편번호가 입력되어 있지 않은 경우나 입력한 문자가 7자리가 아닌 경우는 경고를 표시한다
코드 예
AddressModel.swift
// このコードは参考にした記事より流用した
struct AddressModel: Decodable {
var results: [Result]
struct Result: Decodable {
var address1: String
var address2: String
var address3: String
var kana1: String
var kana2: String
var kana3: String
}
}
ViewController.swift
import UIKit
import Alamofire
class ViewController: UIViewController {
private var addresses: AddressModel?
@IBOutlet weak var zipCodeTextField: UITextField!
@IBOutlet weak var seachButton: UIButton!
@IBOutlet weak var resultLabel: UILabel!
@IBAction func tapSeachButton(_ sender: Any) {
self.getAddress(zipCode: zipCodeTextField.text)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
private func getAddress(zipCode: String?) {
self.validate(zipCode: zipCode)
let baseUrl = "https://zipcloud.ibsnet.co.jp/api/"
let searchUrl = "\(baseUrl)search"
let parameters: [String: Any] = ["zipcode": zipCode!]
let headers: HTTPHeaders = ["Content-Type": "application/json"]
self.requestAPI(url: searchUrl, parameters: parameters, headers: headers)
}
private enum ErrorType:String {
case zipCodeNil = "郵便番号が確認できません"
case zipCodeBrank = "郵便番号を入力してください"
case zipCodeLengthNot7 = "郵便番号は7桁で入力してください"
}
private func validate(zipCode: String?){
guard let zipCode = zipCode else { self.showAlert(error: .zipCodeNil); return }
if zipCode == "" { self.showAlert(error: .zipCodeBrank); return }
if zipCode.lengthOfBytes(using: .utf8) != 7 { self.showAlert(error: .zipCodeLengthNot7); return }
}
private func showAlert(error: ErrorType) {
let alert = UIAlertController(title: "検索に失敗しました", message: error.rawValue, preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .default, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}
private func requestAPI(url:String,parameters:[String:Any],headers:HTTPHeaders) {
AF.request(url, method: .get, parameters: parameters, encoding: URLEncoding(destination: .queryString), headers: headers).responseJSON { response in
guard let data = response.data else { return }
do {
try self.parse(data: data)
} catch let error {
print("Error: \(error)")
self.showError()
}
}
}
private func parse(data:Data) throws {
self.addresses = try JSONDecoder().decode(AddressModel.self, from: data)
if let address = self.addresses {
self.show(result: "\(address.results[0].address1) \(address.results[0].address2) \(address.results[0].address3)")
}
}
private func show(result:String){
resultLabel.text = result
}
private func showError(){
resultLabel.text = "検索結果が取得できませんでした"
}
}
참고 자료
Alamofire
표준과 Alamofire에서 API 호출 처리를 비교해 봅니다 (Swift)
Reference
이 문제에 관하여([iOS/Swift] Alamofire를 이용한 앱 구현(우편번호 검색 앱을 예로)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tanakadaichi_1989/items/fe3ba50b159bc64624f0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)