음 우선 제목을 이렇게 지어도 되는지 모르겠지만 ,, 위의 동영상을 보시면 텍스트필드의 텍스트값이 변함에 따라 동시에 밑에 라인과 라벨이 생기는 걸 알 수 있습니다! 코드를 보면 (정규식도 사용을 해서 밑에 코드에 생략된 부분이 많습니다 ...) private func actionEmailTextField() { emailTextField.addTarget(self, action: #selector(SignUpFirstViewController.textFieldDidChange(_:)), for: UIControl.Event.allEditingEvents) } private func actionPasswordTextField() { passwordTextField.addTarget(self, action..
보통 회전목마 라고 많이 하는데 수평방향으로 스크롤되는 뷰이다. 스크롤뷰를 사용해서 구현하는 방법, 컬렉션뷰를 이용해서 구현하는 방법이 있는데 이번에는 컬렉션뷰를 이용해서 구현해보겠다. 모든 앱에서 흔히 쓰이는 기능이라 알아두면 좋을 것 같다! 순서를 차근차근 설명해보겠다 ! 내가 만드려고 하는 뷰는 요런 뷰이다! 가운데뷰 양옆 뷰에 알파값, 사이즈를 조절해야한다..! 이게 무슨 소리인지 모르겠으니,, 구현한 모습을 보겠다! 이런 모습이다..! 이것을 활용해서 만들 수 있는 것이 다양하니 알아두자..! // // MoodViewController+Carousel.swift // Mohaeng // // Created by 김승찬 on 2021/09/16. // import UIKit class Carou..

assert - 특정 조건을 체크하고, 조건이 성립되지 않으면 메세지를 출력 하게 할 수 있는 함수 - assert 함수는 디버깅 모드에서만 동작하고 주로 디버깅 중 조건의 검증을 위하여 사용한다. guard 문 - 뭔가를 검사하여 그 다음에 오는 코드를 실행할지 말지 결정 하는 것 - guard 문에 주어진 조건문이 거짓일 때 구문이 실행됨 assert import Foundation var value = 0 assert(value == 0) value = 2 aseert(value == 0, "값이 0이 아닙니다") playground에서 코드를 작성하고 실행하면 런타임 에러가 발생한다. assert 함수는 값을 실행하고 조건이 맞지 않으면 에러를 발생시키는 함수기 때문에 이렇게 나온다. guard ..

릴리즈를 준비하면서 카카오톡 소셜 로그인 뷰를 맡아서 미리 공부를 해보았다! 스터디하면서 구현을 했었던 적이 있었는데 그 때 엄청 꼬여서 애를 먹었었는데,, 이번에는 천천히 구현을 해보겠다..! 시작하기 전에 카카오 로그인은 사용자를 인증하고 토큰을 발급하는 기능이다. 토큰은 액세스 토큰(Access Token)과 리프레시 토큰(Refresh Token) 두 종류이다. 액세스 토큰은 사용자 정보 기반의 API를 호출하는 데 쓰이고, 리프레시 토큰은 일정 기간동안 사용자 인증 절차를 거치지 않고도 액세스 토큰을 갱신할 수 있도록 해 준다. 사용자의 카카오계정을 인증하는 방식에 따라, iOS SDK를 사용한 카카오 로그인 구현 방법은 두 가지로 나뉜다. 카카오톡으로 로그인 기본 웹 브라우저(Default B..

2021.08.20 - [Sopt 28th 세미나 - iOS] - Alamofire (GET) & Postman Alamofire & Postman POSTMAN 서버가 구현한 API를 테스트 할 수 있는 플랫폼 포스트맨은 서버 데이터가 현재 어떻게 나오고 있는지 파악하기 위해서 테스트 용도로 사용! 혹은 response body 확인 -> 멀쩡하게 이미지가 출 seungchan.tistory.com 2021.08.20 - [Sopt 28th 세미나 - iOS] - Alamofire (POST) Alamofire (POST) POST LoginDataModel.swift import Foundation // MARK: - LoginDataModel struct LoginDataModel: Codable ..
LoginDataModel.swift import Foundation // MARK: - LoginDataModel struct LoginDataModel: Codable { let success: Bool let message: String let data: UserData? enum CodingKeys: String, CodingKey { case success case message case data } init(from decoder : Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) success = (try? values.decode(Bool.self, forKey: .success)) ?? false..
세미나에서 서버 통신 할 때 뇌절이 와서,, 제대로 못했던 기억이 난다... 2021.08.20 - [분류 전체보기] - Alamofire & Postman Alamofire & Postman POSTMAN 서버가 구현한 API를 테스트 할 수 있는 플랫폼 포스트맨은 서버 데이터가 현재 어떻게 나오고 있는지 파악하기 위해서 테스트 용도로 사용! 혹은 response body 확인 -> 멀쩡하게 이미지가 출 seungchan.tistory.com 너무 양이 방대해서 핵심만 짚고 넘어가보겠다 ! 1. NetworkResult.swift -> 네트워크 결과를 나누기 위해 enum 형으로 선언 2. XXXDataModel.swift -> JSON 데이터를 담아내기 위해 데이터 구조체를 만들고 Codable 채택..

POSTMAN 서버가 구현한 API를 테스트 할 수 있는 플랫폼 포스트맨은 서버 데이터가 현재 어떻게 나오고 있는지 파악하기 위해서 테스트 용도로 사용! 혹은 response body 확인 -> 멀쩡하게 이미지가 출력이 되던 부분이 갑자기 출력이 안될 때 포스트맨에서 해당 URL 찍어서 현재 데이터가 어떻게 넘어오고 있는지 파악! Alamofire pod init vi Podfile pod install "Allow Arbitary Loads" 해당 속성을 YES로 설정해야 빌드시에 네트워크 통신이 가능하다! 1. NetworkResult.swift import Foundation enum NetworkResult { case success(T) -> 서버 통신 성공했을 때 case requestErr(..

Escaping Closure (탈출 클로저) class ViewController: UIViewController { var sampleClosure : () -> Void = {} override func viewDidLoad() { super.viewDidLoad() callback { print("Closure가 실행되었습니다.") } } func callback(closure: () -> Void) { sampleClosure = closure sampleClosure() } } 클래스에 sampleClosure 변수를 선언하고, 해당 callBack 함수 내부에서 매개변수로 받은 closure를 대입하려고 하면 에러가 발생! 스위프트에서는 함수의 파라미터로 전달된 클로저는 기본적으로 함수 내부..