Scroll 기능을 구현하기 위해 자연스럽게 UIScrollView를 사용하게 되었다. 익숙한 TableView를 사용할까 고민했지만 낯선 것에 한 번 도전해보자! 하고 모험은 시작되었다...... 맨 처음 나는 let scrollView = UIScrollView() let subview1 = UIView() let subview2 = UIView() let subview3 = UIView() view.addSubview(scrollView) scrollView.addSubview(subview1) scrollView.addSubview(subview2) scrollView.addSubview(subview3) scrollView.snp.makeConstraints { make in make.edges..
storyboard가 아닌 코드로 View를 구성할 때 required init 을 구현하라는 에러를 만나게 된다!required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented")}에러 fix 를 누르면 이러한 코드가 생긴다. 🤔 이 코드가 왜 필요하지?우선, required init은required: 필수의뜻대로 필수 생성자이다.자식클래스에서 반드시 구현해야하는 init이라 부모클래스에서 required init으로 설정. UIView나 UIViewController의 경우에는 NSCoding이란 프로토콜을 채택하고 있는데xml로 저장되어 있는 storyboard를 사용자의 화면으로 가져오기 위해서 init(c..
인스턴스 프로퍼티- 인스턴스 마다 저장된다. 타입 프로퍼티- static 키워드 사용- 하나로 다같이 공유- 데이터 영역에 영구적으로 저장된다- 어차피 모두 같은 값을 쓸 거니까 값도 같이 넣어준다struct User { static let shared = User() let name = "이름"}보통 이렇게 인스턴스를 shared라는 이름을 가진 타입 프로퍼티에 넣어주고외부에서 인스턴스를 생성하지 않고 타입 프로퍼티를 사용하여 인스턴스 메서드나 프로퍼티에 접근한다(필요할 때마다 매번 인스턴스를 생성하면 비효율적이기 때문)print(User.shared.name) 저장 프로퍼티지연 저장 프로퍼티 - lazy var 키워드 - lazy는 var 와 함께 사용한다 let은 불가 - 왜요?? 사용될 때..
웹으로는 잘 보이는 API가 시뮬레이터로는 접근이 불가능한 문제가 발생했다. void * _Nullable NSMapGet(NSMapTable * _Nonnull, const void * _Nullable): map table argument is NULL [boringssl] boringssl_context_handle_fatal_alert(1991) [C1.1.1.1:2][0x12a8680d0] read alert, level: fatal, description: illegal parameter [boringssl] boringssl_session_handshake_incomplete(88) [C1.1.1.1:2][0x12a8680d0] SSL library error [boringssl] borin..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/br0jUH/btrPQIn49JR/nDEKlyIqup5Wnc0z53JYZk/img.png)
어떤때에 뭘 써야할지 헷갈렸는데 내가 이해한대로 대충 정리해보면 이런 느낌인 것 같다. - State는 뷰 내에서 소박하게,, - Observable은 외부클래스를 여러 다른 뷰에서 사용가능하지만 다른 뷰로 이동시 계속 넘겨줘야한다. (앱 내의 여러 뷰가 동일한 구독객체에 접근해야하는 경우 복잡해질 수 있다고 한다.) - Environment는 별도로 값을 전달하지 않아도 모든 뷰에서 사용 가능하다. @ : 프로퍼티 래퍼 $ : Binding ( $ 어묵꼬치처럼 생겼는데 꼬챙이로 찍어서 연결시킨다고 생각하면,, 될까,,) @State 상태프로퍼티 ObservableObject EnvironmentObject - 해당 View내에서만 사용 - private 형태 - 여러 뷰에서 동시에 State값을 참고하..
연산 프로퍼티 직접 값을 저장하지 않고 다른 저장 프로퍼티를 가지고 작업하는 것 class Phone { var iPhone: String = "iPhone Xr" // get set에서 쓸 수 있는 저장프로퍼티가 꼭 존재해야함 var myPhone: String { // 타입 추론 불가능해서 타입 꼭 적어줘야 함 get { return iPhone + "쓴 지 4년째" // iPhone이라는 저장프로퍼티의 값을 (연산해서) return // get 속에 내용이 한 줄일때만 return 생략가능함 } set { iPhone = newValue + "버티기" // iPhone이라는 저장프로퍼티에 새로운 값을 저장하는 역할 } // set(iPhone) { // self.iPhone = iPhone + " ..