Swift TIL(65) - self ~ lazy var 문제해결, 오토레이아웃 지정, 변경, 애니메이션, 코드 스니펫 설정

웰디(Well-D)·2023년 10월 31일
0

Sweet & Soft, SWIFT

목록 보기
64/76

하드코딩으로 컴포넌트들을 만들고 오토레이아웃을 구성하여 UI 짜기

프레임과 오토레이아웃

표면적으로는 구) 프레임 => 현) 오토레이아웃(상대적, 동적) 시스템으로 UI를 그리는 방식으로 변경
실제로는 프레임 시스템도 존재하여 내부에 구현된 것을 프레임에 직접 그리게 됨
항상 제약에서 leading 이 왼쪽인것은 아님(글자가 시작되는 방향이 leading 일뿐)

lazy var 문제해결

문제상황

private let passwordResetButton: UIButton = {
        let button = UIButton()
        button.backgroundColor = .clear
        button.setTitle("비밀번호 재설정", for: .normal)
        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
        button.tintColor = .white
        button.addTarget(self, action: #selector(resetButtonTapped), for: .touchUpInside)
        return button
    }()

위와 같은 코드에서

button.addTarget(self, action: #selector(resetButtonTapped), for: .touchUpInside) 

부분의 self 에서 경고가 발생함

에러내용

'self' refers to the method 'ViewController.self', which may be unexpected

xcode의 권장 해결방법(해결x)

button.addTarget(ViewController.self, action: #selector(resetButtonTapped), for: .touchUpInside) 

self => ViewController.self 로 변경 권장

문제해석(내피셜)

여기서 에러가 나는 이유는 addTarget이 self 에 접근할때는 아직 button속성이 초기화 되지 않았을때 이기 때문이다. 따라서 addTarget에서 까지 메서드가 다 완료되고 난 후에 button 이 리턴되어 그제서야 passwordResetButton 변수가 생길수 있도록(lazy하게 button 속성들이 완성된 후에 생기도록)

해야하는 것이다. (추측)

찾아보니 비슷한 에러가 있어서 그걸 기반으로 (영어..) 해석해 본 결과이다. 내가 참고한 원문은 다음 스택오버플로우 와 나의 여태까지 배운 문법..

스택오버플로우

해결방법

xcode 추천 방식으로 고치면 안되고 private let 을 lazy var 로 변경해야한다.

private lazy var passwordResetButton: UIButton = {
        let button = UIButton()
        button.backgroundColor = .clear
        button.setTitle("비밀번호 재설정", for: .normal)
        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
        button.tintColor = .white
        button.addTarget(self, action: #selector(resetButtonTapped), for: .touchUpInside)
        return button
    }()

추가

코드스니펫 설정

(눌러서 확대하세요)

profile
Wellness 잘사는 것에 진심인 웰디입니다. 여러분의 몸과 마음, 통장의 건강을 수호하고싶어요. 느리더라도, 꾸준히

0개의 댓글