처음 Keyboard Extension으로 키보드 확장 프로그램을 개발 할 때 한글 조합이 알아서 되는줄 알았지만, 스스로 조합이 되지 않았다. 안드로이드는 자동으로 조합을 해주는데 ios에서는 스스로 알고리즘을 만들어야 합니다.. 오토마타에 관해 전공수업을 들었어서 한글 오토마타를 구상, 알고리즘으로 구현해보았습니다. 일단 알고리즘을 제작하기전 오토마타 그래프를 만들었습니다. 알고리즘을 구현하는데 Stack을 사용해서 한글을 지울때 이전 상태로 돌아가서 다음 상태로 이동할 수게 구현해서 처음부터 한글을 조합하는 작업을 하지 않아도 되서 좀 더 효율적인 알고리즘으로 구현했습니다. 메멘토 패턴을 이용한것이라 볼 수 있습니다. enum HangulStatus { case start //s0 case chos..
요즘 앱 로그인 할때 대부분 소셜 로그인을 사용합니다. 토이 프로젝트를 진행 할 때 소셜로그인을 넣으려고 했는데, 각 소셜 로그인마다 ViewModel에 googleLogin, kakaoLogin, appleLogin..등등 각 로그인 함수를 넣어서 구현하는것은 SOLID 원칙에도 위배되고, 각 케이스 마다 비슷비슷한 코드를 써야하기에 비효율적이라 생각해 클린 아키텍처를 사용해서 구현해 보게되었습니다. 우선은 전체적인 Coordinator 패턴 흐름도입니다. AppCoordinator의 start에서 로그인을 했는지 안했는지 판단하고 로그인을 했으면 오토로그인, 하지 않는 경우에는 로그인뷰를 보여주게 됩니다. 여기서 LoginRepository는 각각 구글, 카카오, 애플 로그인 오브젝트를 말합니다. 각..
Responder Chain Responder란 터치 이벤트를 처리할 수 있는 객체를 의미합니다. 터치 이벤트가 발생할 경우 iOS는 터치이벤트가 발생한 지점의 최상위 뷰를 찾습니다. 최상위 뷰를 First Responder이라 하는데 만약 First Responder가 이벤트를 처리하지 못할경우 최상위 뷰에서 하위뷰로 파고들며 이벤트를 처리 가능한 Responder를 찾게 되는데 이 과정을 Responder Chain이라 합니다. First Responder First Responder는 hitTest(_:with) 메서드로 찾는습니다. 이 메서드는 터치 이벤트가 발생했을 시점에 최상위 뷰의 hitTest가 호출될때까지 UIWindow부터 터치된 지점의 subView들의 hitTest 메서드를 순차적으..
저는 여태까지 API를 가지고 네트워크 요청을 할때 func requestMovies(page: Int, completion: @escaping ()->Void) { URLSession.request(..... } 이런식으로 특정 네트워크 요청을 위한 함수를 만들어서 요청하는 식으로 코드를 짜왔습니다. 또한 이런 네트워크 작업을 하는 객체를 싱글톤 객체로 만들어서 작업을 했지요. class NetworkManager { static let networkManager = NetworkManager() func requestMovies() { } func requestUserInfo() { } . . . } 이런식으로 말입니다. 이런 방식은 NetworkManager가 요청 생성, 인코딩, 디코딩 등등을 모..
이번에는 검색창에 검색어를 입력해서 값을 받아오는 작업을 진행하도록 해봅니다. 우선은 검색에 필요한 ViewModel의 Input과 Output을 정의합니다. protocol MoviesListViewModelInput { func viewDidLoad() func didSearch(query: String) } protocol MoviesListViewModelOutput { var items: Observable {get} var query: Observable {get} var error: Observable {get} var isEmpty: Bool {get} var screenTitle: String {get} var emptyDataTitle: String {get} var errorTitle..
다른 계층이 의존하고 있는 Domain 계층이 완성이 되었으니, 첫 화면인 MovieList 부분부터 진행하도록 해봅시다. 우선은 MoviesList를 구성해줍니다. SuggestionView와 MoviesListView를 containerView로 만들어주고 MoviesListView 역시 스토리보드로 UI를 배치해줍니다. class MoviesListViewController: UIViewController, StoryboardInstatiable, Alertable { @IBOutlet var contentView: UIView! @IBOutlet var searchBarContainer: UIView! @IBOutlet var moviesListContainer: UIView! @IBOutlet ..