ios 33

MVVM 패턴 적용

아이디, 비밀번호를 입력했는지 감지하는 기능 사용한 라이브러리: UIKit, SnapKit, RxSwift, RxCocoa (storyboard 사용 X) 설명: 아이디 비밀번호를 입력한 경우 버튼 문구가 '로그인'으로 변경된다. 둘 중 하나라도 입력하지 않은 경우 '정보 부족'을 출력한다. □ View import UIKit import SnapKit import RxSwift class ViewController: UIViewController { /* UI 생성 코드 */ //ID Label lazy var IdLabel: UILabel = { let l1 = UILabel() l1.font = .systemFont(ofSize: 20) l1.text = "아이디" return l1 }() // P..

iOS/MVVM 2023.01.18

RxSwift 사용

RxSwift RxSwift는 데이터가 Stream 방식으로 흘러간다. Observer Observable안에 있는 내부 인스턴스들로 Observable의 값에 변화가 있을 때 Observer에게 알림이 가고, 등록한 Closure 실행 Subject Observable과 Observer의 성격을 모두 가지고 있는 Protocol (이벤트 방출과, Subscribe를 이 타입 하나로 모두 가능) subject 없이 이벤트 처리를 한다면 observer, Observable 두개 타입이 필요 Observable은 1:1로 이벤트를 방출하지만 1:multi로 이벤트를 여러 Observer에게 송신 Observable RxSwift에서 제공하는 "나중에 생기는 데이터" 타입의 이름 Observer 인스턴스를 ..

iOS/RxSwift 2023.01.14

Swift - Class 성능 향상 시키는 방법

final을 붙이면 성능이 향상된다. 왜??? 이유를 알기 위해서는 Dispatch라는 것을 알아야 한다. Dispatch 내가 호출할 함수를 컴파일 타임에 결정하냐, 런타임에 결정하냐에 따른 방식이다. StaticDispatch (Direct Call) 컴파일 타임에 호출되니 함수를 결정하고 런타임에 그대로 실행된다. 컴파일 시간에 결정되기 때문에 성능상 이점이 있다. Dynamic Dispatch (Indirect Call) 런타임에 호출될 함수를 결정한다. swift는 클래스마다 함수 포인터들의 배열인 vTable이라는 것을 유지한다. 하위 클래스가 메서드를 호출할 때, vTable을 참조하여 실제 호출할 함수를 결정한다. 위와 같은 과정이 런타임에 발생하기 때문에 성능상 손해를 보게 된다 Refe..

iOS/Swift 상식 2023.01.07

iOS - Storyboard vs Code

StoryBoard 장점 - 결과물 예층 쉬움, 속성 쉽게 확인 가능 - 쉽게 UI 생성 가능 - pop, push, present, dismiss등의 코드를 사용하지 않아도 됨 단점 - 화면 로딩 시 무거움 - 링크가 끊어진 경우 파악하기 힘듬 - 협업 문제 발생 가능 ( 오류가 발생한 경우 파악하기 힘듬) - 데이터 흐름이 표시되지 않음 - 앱이 커지면 가독성이 떨어짐 Code 장점 - 가볍다 - 협업 하기 편리하다 - 모든 UI요소에 제어감각이 생긴다. - 재사용하기 용이 - Launch Screen을 제외한 모든 코드가 코드로 구현 가능하다. - 스토리보드는 및 nib는 loading 및 parsing 오버헤드에 영향을 받는다. 단점 - 해당 컴포넌트를 숙지해야 함 - 어떤 화면이 만들어질지 파악..

iOS/Swift 상식 2023.01.07

Autolayout 제약걸기 (코드 - 1)

□ 버튼 생성 및 제약 걸기 let btn1: UIButton = .init(frame: .init()) btn1.backgroundColor = .yellow btn1.setTitle("안녕하세요", for: .normal) btn1.setTitleColor(UIColor.black, for: .normal) self.view.addSubview(btn1) btn1.translatesAutoresizingMaskIntoConstraints = false // false - AutoLayout을 따르겟다 // true - frame을 따르겠다. btn1.topAnchor.constraint(equalTo: self.view.topAnchor,constant: 100).isActive = true btn1..

iOS/AutoLayout 2023.01.07

Intrinsic Content Size, Priority

Intrinsic Content Size 컨텐트의 본질적인 크기를 의미한다. 다음 표를 보면 쉽게 이해할 수 있다. Label, Button, Switch, TextField는 본질적인 크기를 가지고 있어서 오토레이아웃을 지정하는 경우 에러가 나지 않는다. Priority Hugging Priority 두 오브젝트 중 한 오브젝트가 커져야 하는 상황일 때 우선순위가 낮은 오브젝트는 Instrinsic size를 유지하지 않고 커진다. Compression Resistance Priority Hugging Priority와 반대되는 상황이다. 한 오브젝트가 크기 및 내용이 너무 길어서 다른 오브젝트 영역을 넘어갈 때 둘의 우선순위가 같아서 어떤 오브젝트를 줄여야 할지 모를 때 사용한다. 해당 우선순위가 높..

iOS/AutoLayout 2023.01.07

Frame vs Bounds

Frame Super View 좌표계에서 View의 위치와 크기를 나타냄 FirstView의 SuperView는 루트 View가 된다. SecondView의 SuperView는 FirstView이다. (클래스 상속할 때 슈퍼클래스와 같은 Super 같다) frame origin(x, y) frame의 origin(x, y) 좌표는 SuperView의 원점을 (0,0)으로 놓고 원점으로부터 얼마나 떨어져 있는지 나타낸다. SuperView의 원점은 왼쪽 맨 위에 해당한다. 그래서 frame의 origin좌표는 SuperView에서 x, y 만큼 떨어져 있다고 표현할 수 있다. □ frame origin 좌표 변경한 경우 secondView의 frame origin 좌표를 변경하는 경우 thirdView도 ..

iOS/AutoLayout 2023.01.07

Swift 문법과 친해지기 - MRC/MMR(Objective-C 잔재)

제목에서 보다시피 MRC/MMR은 과거 Objective-C에서 사용하던 메모리 관리 기법이다. ARC의 RC는 Reference Counting이지만 MRC의 RC는 Retain Counting이라고 한다. 소들이 님의 블로그를 보고 이해한 결과 TestClass *test = [[TestClass alloc] init]; 라고 선언을 하면 alloc을 통해 힙 영역에 자동적으로 할당이 되고 Retain Count는 1 증가한다. 그 후 TestClass *test2 = test; test2에 test 주소값을 복사하는 경우 Retain Count이 증가하지 않는다.!!!! 이런 것 때문에 수동 메모리 관리 기법이라고 한다.. Retain Count를 올려주기 위해 TestClass *test2 = t..

iOS/문법 2023.01.07

Swift 문법과 친해지기 - Strong, Weak, unowned, 순환 참조

Strong - 강한 참조 강한 참조는 인스턴스가 할당되고 RC가 증가하면 강한 참조라고 한다. default값이 강한 참조로 구성된다고 한다. 순환 참조 ARC의 단점으로 '순환 참조가 발생될 경우 영구적으로 메모리가 해제되지 않을 수 있다'가 있다. □ 순환 참조 예시 1 class Man { var name: String var girlfriend: Woman? init(name: String) { self.name = name } deinit { print("Man Deinit!") } } class Woman { var name: String var boyfriend: Man? init(name: String) { self.name = name } deinit { print("Woman Dein..

iOS/문법 2023.01.07