제목이.. 길다 🥲 뷰를 쌓는 방법이 크게 2가지가 있는데 push, present로 나눌 수 있다. push는 navigation controller를 감싸고 있는 뷰에서 가능하고, present는 그렇진 않지만 present위에 뷰를 push 하는건 불가능하다. push -> navigation controller로 감싼 뷰 위에만 가능 present -> 그냥 뷰 위에 가능 아무튼 이런 개념을 전제로 하면 present한 뷰 위에는 push가 불가능하지만, present한 뷰를 navigation controller로 감싸면 그 위에 push가 가능하다. 내가 궁금했던 상황은 다음과 같다 VC1에서 VC2를 Push하던 중 Navigation controller를 감싼 VC3 Present를 하여 ..
코드로 뷰를 구성한 경험은 몇번 있지만 스토리 보드로 화면을 구성하는 익숙해져서 다시 기억속에서 사라졌다 ㅠ.ㅠ 아무래도 지금 다니는 회사에서는 스토리보드로 화면을 구성하니 스토리보드는 따로 연습하지 않아도 익숙해질 수 밖에 없는 환경이기 때문에 혼자서 하는 연습 예제나 프로젝트는 코드로 구성하는 방법으로 해봐야겠다! 구성한 화면은 아래와 같다. UIViewController - UIView - UIView - UIButton 으로 구성되어 있다. 조금 더 자세히 보자면 ... 이런 계층으로 구성되어 있다. (이 기능 너무 좋다 🫶🏻) 먼저 화면을 구성하는 전체적인 틀은 다음과 같다. // 새로운 뷰 생성 let newView = UIView() // 기본 뷰에 추가 view.addSubview(newV..
AutoLayout을 공부하면서 landscape와 portrait에 따른 화면 구성 방법을 공부했다. 내가 들은 강의가 조금 옛날 강의라 Vary for Traits을 사용한 화면구성방식을 소개했는데, 내가 현재 공부하는 23년 3월 시점에는 이 기능이 없었다. 찾아보니 xcode 13 업데이트 부터 이 버튼이 사라져 다른 방법을 사용해야했다. 해결방법을 찾던 중 사람들이 추천해준 동영상을 보게 되었고, 여기서 해답을 얻을 수 있었다. 나는 첫번째 세로 화면에서는 2x2로 구성된 네모 박스를 가로 화면일때는 1x4로 나타나도록 구성하고 싶었다. (어찌됐건 가로 세로 화면 구성을 다르게 하고 싶었다!) 시작 1. 먼저 세로 화면일 때 내가 원하는 Constraints를 추가한다. 2. Constraint..
TableView나 TextField와 같은 기능을 사용할 때 가끔 tableView.delegate = self 를 적어주지 않아 동작이 안될때가 있었다. 매번 습관적으로 이 코드를 적어주었지만 왜 이걸 적어야 하는지 알아보고자 한다. 델리게이트 패턴이란? 이름 그대로 위임한다 라는 의미이다. 즉 의임자를 갖고 있는 객체가 다른 객체에게 자신의 일을 위임하는 형태의 디자인 패턴으로 객체와 객체간의 대화라고 생각할 수 있다. class ViewController: UITableViewDelegate { func tableViewFunction() { print("tableview 첫번째 함수 실행") } // 실행부 let tableView = UITableView() tableView.delegate ..
1. heap보다는 stack에 메모리를 할당 class보단 struct나 enum을 사용한다. class는 heap할당, struct나 enum은 stack할당이므로 메모리 할당 class: heap struct: stack enum: stack heap ⇒ 메모리 할당을 사용하지 않은 영역을 찾아 할당하는 방식(동적할당)이므로 좀 복잡함 (속도가 느림) stack ⇒ LIFO 방식이므로 메모리 구조가 단순함 (속도가 빠름, O(1)) 2. 정적 디스패치(static Dispatch)를 지향 일반적으로 swift에서는 dynamic dispatch를 사용하도록 되어있음 클래스(메서드, 프로퍼티)를 선언할 때 상속되지 않는 클래스에 final을 붙이면 성능이 향상됨 클래스는 dynamic dispatch..
struct 값 타입 (데이터를 전달할 때 값을 복사하여 전달) 상속 불가 메모리에서 자동제거 ⇒ 함수 종료(지역변수, 매개변수), 프로그램 종료(static, 전역변수) 인스턴스 상수로 선언시 저장속성 전부 상수로 선언 메서드 내에서 속성 변경 불가능 소멸자 없음 class 참조 타입 (데이터를 전달할 때 값의 메모리 위치를 전달) 상속 가능 ARC로 메모리 관리 인스턴스 상수로 선언해도 가르키는 let/ var 선언에 따름 메서드 내에서 속성 변경 가능 소멸자 있음 객체 대신 인스턴스라는 용어 사용 enum 한정된 사례(case) 안에서 정의할 수 있는 타입 (요일, 성별 ..) 케이스가 선택가능한 가짓 수로 정해져 있을 때 정의 ⇒ 다른것 넣으면 타입 에러 상속 불가능 공통점 개발자가 마음대로 만들..
기초를 처음부터 다시 다지면서 타입 주석과 타입 추론의 개념을 접하게 되었다. 타입 추론은 기존에 알고 있었지만 타입 주석이라는 단어는 이번에 처음 접하게 되었으나 이미 알고 있는 개념이긴 했다. 두 개념은 모두 변수를 선언할 때 사용되는 개념이다. 1. 타입 주석(Type Annotation) var name: String var name: String = "Lily" 타입 주석은 변수를 선언할 때 변수의 자료형까지 함께 명시해주는 것을 의미한다. 첫번째 줄 처럼 name이라는 변수를 선언하면서 String이라는 자료형까지 함께 지정해준다. 두번째 줄 처럼 선언과 동시에 값을 지정해줄 수 있다. 2. 타입 추론(Type Inference) var name = "Lily" 타입 주석과 달리 변수를 선언할..
본 게시물은 OAuth를 구현하는 방법이 아닌 제가 생각한 특징을 정리한 글입니다. 이번에 다이어리 앱을 새로 업데이트하면서 소셜로그인 기능을 도입하기로 결정했다. 기존에 CoreData로 앱 내에 저장하던 다이어리 데이터를 보다 안전하게 저장하기 위해 firebase에 저장하기 위해서였다. 애플 정책에 따라 Apple로그인은 구현하지 않으면 리젝 사유가 된다. 😅 따라서 Apple Login은 당연히 구현하기로 결정했고, 조사해보니 사용자가 가장 많이 사용하는 소셜로그인이 Kakao라는 것을 알게되었다. 사용자의 편의를 위해 Kakao를 추가하고, 추가적으로 전에 구현해본 경험이 있는 Google로그인도 함께 적용하기로 결정했다. 1. Apple 애플로그인은 꼭 애플 개발자 계정이 있어야 한다. 1년에..