SHcommit / LearnMoreSwiftInUdemy

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Clone/Instagram] Login Scene 구현 | 복습 & 새롭게 알게된 개념 #3

SHcommit opened this issue · comments

Login Scene 구현

강의를 보기전에 혼자 구현해봤다. 난 그냥 anchor로 구현했는데 강의에선 email, password, login버튼 다stackview로 구현했다. 난 그 아래 작은 글씨들만 stackView로 구현했다.

로그인 할 때 초기에 navigationBar를 숨기는 방법도 있다는 것을 새롭게 알았다.. 그라디언트는 내가 맘에 드는 색으로 정했다!!

까다로웠던 점

  • UITextField의 margin은 어떻게 줘야하는가?

원래 view에 마진을 줄 때는 layoutMargins의 값으로 UIEdgeInsets()를 적용했는데 textField는 되지 않았다. 그후로 공식문서를 살펴보니 editing 양 옆에 overlay view로 leftView, rightView가 존재한다는 것을 알게 되었다. 정리 차원에서 글을 작성했다.

복습한 개념

  • lazy키워드는 언제 써야하는가?

lazy키워드는 인스턴스의 초기화를 늦출수 있다는 장점이 있기에 메모리를 훨씬 절약해서 사용할 수 있다. lazy가 초기화 되는 시점은 해당 인스턴스가 사용되는 시점이다. 클로저를 통해서 인스턴스를 초기화한다. 순환 참조를 일으키지 않고 @NoEscape가 적용된다. 그렇다면 모든 인스턴스를 lazy키워드로 써야할까?

음.. 원래 클래스 또는 구조체의 초기화는 변수들을 훓은 담에( 변수 생성과 동시에 초기화 되는 변수가 있는지?) init() 생성자 함수가 실행된다. 이를 통해 thread는 변수들의 초기화를 진행하는데 lazy의 경우 변수는 초기에 값이 존재하지 않는다. 그래서 thread safety가 보장되지 않는다.

변수를 초기화하는 함수의 경우 static타입인 정적으로 선언해야 변수의 초기화가 가능하다. 하지만 lazy의 경우 클래스 내 변수들의 초기화 시점에 초기화 되지 않기에 static 키워드를 붙이지 않아도 된다.

동시성적인 프로그래밍 상황에서는 lazy var 변수선언이 옳은가? 시간 내서 다시 한번 정독해봐야겠다..

그렇다면 진짜로 언제 써야하는가?

이 강의를 보면서 알게 됬는데 버튼의 경우 addTarget시에 self 를 참조한다. 근데 이것은 해당 클래스가 완전히 초기화되지 않은 상태에서 버튼 변수의 선언과 동시에 초기화를 할 때 addTarget의 self를 참조하는 것보다 lazy키워드를 선언해 해당 클래스가 완전히 초기화 된 이후에 버튼에 대한 초기화에서 addTarget(self...)가 들어가는게 바람직하다고 한다.

이 말고도 순환참조가 일어날 상황의 클래스의 변수에 대해서도 lazy키워드를 선언해도 좋다. 또한 서버에서 다량의 데이터를 불러와야할 경우에도 뷰가 호출되는 시점에 바로 다량의 데이터를 불러오는 것보다 사용자의 액션에 의해 서버 데이터가 필요한 경우에만 호출할 수 있도록 lazy 키워드를 사용하는 것이 좋다.

새롭게 알게된 개념

  • CAGradientLayer

안드로이드에선 초반에 배웠었는데 그라디언트 넣는 방법을 ios공부한지 약 7개월만에 접하게 됐다ㄷㄷ...

  • .backgroundColor = .init(white: 1, alpha: 0.1)

UIView의 백그라운드를 위와같이 정하면 superView의 백그라운드 색과 잘 어울리도록 된다.