[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)
  • 좋은 웹페이지 즐겨찾기