Swift API接続注意点2 忘備録 読まないこと!

まず、画面とRequestは分ける。

実装は疎結合にしておくのが基本

Modelのフォルダを作成した

User.swiftは、リクエストにもレスポンスにも使える、モデル構造を持っている

f:id:happy_teeth_ago:20190314005500p:plain

LoginRequest GitHubRequestを継承している。

struct LoginRequest : GitHubRequest {
    
    //これ generics
    typealias HTTPBody = SignInBody
    
    //他で必要
    typealias Response = User
  //こっちはプロパティ 初期値はなくて良い getter setter持っている
    var httpBody: SignInBody
    
    var path: String {
       return "/users/sign_in.json"
    }
    
    var method: HTTPMethod {
        return .post
    }
}


struct SignInBody: Codable{
    var user: UserRequest
    
    init(user: UserRequest){
        self.user = user
    }
}

//Codableに準拠しているとinitializer を入れられてしまう。イニシャライザがあっても初期化できるようにvarに変更
struct UserRequest: Codable{
    
    var email: String
    var password: String
    var remember_me = true
    //初期化するように変更した。
    init(email:String, password: String, remember_me:Bool){
        self.email = email
        self.password = password
        self.remember_me = true
    }
    
}
struct UserRequest: Codable{
    
    var email: String
    var password: String
    var remember_me = true
    //こちらも初期化
    init(email:String, password: String, remember_me:Bool){
        self.email = email
        self.password = password
        self.remember_me = true
    }

LogInクラス Viewを主に書くところ ログインボタンが押されたときの処理

 @IBAction func btn_login(_ sender: Any) {
        
        let client = GitHubClient()
//ここでUserRequestを初期化するために、上記クラスにイニシャライザを設定
        //jsonをパースできるように jsonは下記 下から組み立てる
//この画面の入力値を利用していることに注目、なのでジェネリクスを利用する価値がある。
        let userRequest = UserRequest(email: email.text!, password: password.text!, remember_me: true)
      
        let signIn = SignInBody(user: userRequest)
        
        let request = LoginRequest(httpBody: signIn)
        

        client.send(request: request){result in
            switch result{
            case let .success(response):
                print (response.id)
            case let .failure(error):
                print(error)
                
            }
        }
        
    }

sign_in.json の形

userの下位にUserRequest つまりemail passwordなどがある。

{
    "user": {
    "email": "admin@aaa.com",
    "password": "password",
    "remember_me": true
    }
}