최근, 아키텍처 관련 공부를 진행하면서 Input/Output패턴을 공부해 본 경험이 있습니다..! 이러한 Input/Output 패턴을 사용할 때, 정형화 되고 반복된 코드를 줄이기 위해 ViewModelProtocol를 선언하여 해당 프로토콜을 이용하는 방식을 많이 사용합니다. 보편적으로, 아래와 같이 많이 선언하여 사용합니다 protocol ViewModelType { associatedtype Input associatedtype Output func transform(input: Input) -> Output } (물론, MVVM패턴과 RxSwift를 혼용하여 사용하는 경우가 많아 해당 프로토콜에 disposeBag을 선언하기도 합니다) 이때, Input과 Output 앞에 붙어있는 associ..

@discardableResult 이란? discardable을 그대로 해석하면, 버릴 수 있는(폐기할 수 있는) 이라는 뜻 입니다. 즉, discardableResult를 해석하면 '결과값을 버릴 수 있는' 이라는 의미가 됩니다. 따라서 @discadableResult는 함수의 return값을 버려줄 때 사용하게 됩니다. 👉🏻 Return값이 존재하는 함수의 결과를 사용하지 않을 시 나타나는 warning을 지워주는 역할을 합니다. @discardableResult 예시 @discardableResult를 사용하면, 위와같이 노란색 warning 메세지가 사라지는 것을 볼 수 있습니다.
웹뷰를 단순히 불러오기만 하면, iOS에서 많이 사용하는 스와이프 제스쳐를 통해 뒤로가기 & 앞으로 가기 동작은 사용이 불가능 합니다. 이를 사용하기 위해선, 아래의 코드와 같이 작성해주면 됩니다. extension ViewController: WKNavigationDelegate { override func viewDidLoad(){ //MARK: 델리게이트 선언 webView.navigationDelegate = self view.addSubview(webView) if let url = URL(string:"본인이 패키징 할 도메인"){ let request = URLRequest(url:url) webView.load(request) } //MARK: 스와이프 제스쳐로 뒤로가기&앞으로가기 webV..
팀에서 작업중이던 Git을 Clone하고 Build하던 과정에서 Missing package product ~ 와 같은 Error가 발생하였습니다... 해당 에러는, 단순히 cocoapod을 외부에서 참조하는 경우에 package 업데이트나, cache삭제 등과 같은 비교적 간단한 해결법이 존재합니다. (해당 해결법은 구글에 많이 존재하니, 찾아보시길 바랍니다!) 하지만, 제 팀에서 작업중인 프로젝트는 사용 할 cocoapod을 submodule로 등록하여 관리하였습니다. 이러한 경우, Git 저장소에 submodule이 내장되어 있는데 단순 Clone을 하면 submodule의 위치를 정확하게 잡지 못해서 Missing package product 와 같은 에러가 발생 하게 됩니다. 따라서 처음 Clo..
FCM을 설정하던 도중, Build단계에서 Default app has already been configured. 라는 에러가 발생했습니다... 그래서, 스택을 따라 올라가보니 아래와 같은 코드에 도착하게 되었습니다. 해결을 위해 위의 코드를 읽어보니, // Only extensions should potentially be able to call 'configure' more than onse 라고 작성되어 있는 주석 보이시나요?? 해석 해보면, '이 예외는, 잠재적으로 'configure'가 1번 이상 발생할 수 있을 때 불려집니다.' 라는 의미입니다. 그러니까, 우리가 처음 Firebase를 설정 할 때 Firebase.configure() 요놈이 2번 이상 호출되었다는 의미겠죠? 그래서 실제로 ..

RxSwift를 사용하지 않은 KeyboardNotification 다루기 개발을 하다보면, TextField를 선택하였을 때 해당 TextField영역을 KeyBoard가 침범하여 [1] 작성하는 내용 [2] 완료 버튼 등을 가리는 이슈가 발생하곤 합니다. 해당 이슈를 해결하기 위해서는 Notification이라는 Class를 사용해야합니다. UIScrollView 내부에 정의되어 있는 TextField의 경우에는 아래의 코드를 작성하면 TextField를 선택 하였을 때, KeyBoard의 높이만큼 ScrollView가 올라가게 만들 수 있습니다. class SignUpViewController: BaseViewController{ var keyBoardUpDown = false override fu..

class나 func등을 정의할 때, 우리는 앞에 final이라는 키워드를 사용하고는 합니다. 그렇다면 이런 final의 역할은 어떤 것일까요?? 우선 기본적으로, final은 말 그대로 '마지막, 유일한'이라는 의미를 가집니다. 즉, class앞에 final을 붙이게되면 해당 class는 '상속할 수 없는 class'라는 의미를 가지게 됩니다. import Foundation final class 상속불가능한클래스{ } class final을_상속해볼까 : 상속불가능한클래스{ // [Inheritance from a final class '상속불가능한클래스'] 라는 error가 발생한다. } 마찬가지로, func에 final을 붙이게 되면 'override할 수 없는 func'라는 의미를 가지게 됩니다..
The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. 위 에러는 "Podfile.lock"파일의 버전이 동기화되어 있지 않습니다. 'pod install'해주거나 pod을 업데이트 해주세요 라는 에러입니다. 이러한 오류가 발생 했을 땐, 아래와 같이 작업을 진행 해 주세요. 1) Xcode를 종료한 채, 터미널에서 podfile이 저장된 위치로 이동한다. 2) 터미널에서 rm -rf Pods을 입력하고, rm -rf Podfile.lock을 입력해준다. (위 두개의 명령어는, 쉽게 말하면 Pods폴더와 Podfile.lock파일을 제거해주는 명령어입니다.) 3) pod..