해결된 질문
작성
·
266
1
안녕하세요 강사님
섹션8에 활용 앱 30강을 수강 중 self, FirstViewController.self의 차이점이 궁금해서 질문드립니다.
영상의 나온 코드를 작성 후 정상적으로 작동이 되었습니다. 그런데 Xcode에서는 self 대신 FirstViewController.self를 사용하면 경고창이 사라진다고 하길래 Fix 후 실행시켰지만 backbutton 클릭 시 앱이 종료되었습니다.
self와 FirstViewController.self는 어떤 차이점이 있길래 back누를 시 앱이 종료되는 걸까요?
let backButton: UIButton = {
let button: UIButton = UIButton()
button.setTitle("Back", for: .normal)
button.setTitleColor(.white, for: .normal)
button.backgroundColor = .blue
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
// self -> FirstViewController.self 변경
button.addTarget(FirstViewController.self, action: #selector(backButtonTapped), for: UIControl.Event.touchUpInside)
return button
} ()
답변 1
1
안녕하세요! S W 님.
해당 내용은 사실 Swift 문법적인 내용이라..
자세하게 답변드리기 보다는.. 아래와 같은 "메타 타입"의 개념을 살펴보시는 것이 좋습니다.
(구글링 ===> Swift + 메타타입)
https://woozzang.tistory.com/160
1) self는 ===> 메모리에 올라가 있는 실체, 즉 인스턴스를 가리키는 것이고요.
2) 타입.self는 ===> 타입 자체를 가리키는 것이예요.
그래서..
예를 들어,
1)
let myClass: MyClass = MyClass( )
오른쪽에서 MyClass 인스턴스를 생성해서 왼쪽 상수에 담으면.. 힙 메모리에 올라간 (데이터의) 실체가 왼쪽 상수에 담긴것이지요.
그리고 이 데이터 실체를 클래스 내부에서 self라고 합니다. (인스턴스 자신)
그래서 보통은 MyClass 내부에서 자신의 인스턴스를 가리킬때, self를 사용하는 것이고요.
(쉽게 이야기 하자면 self는 붕어빵을 가리키는 것이고요.)
2)
let myClassType: MyClass.Type = MyClass.self
이런 개념도 있어요. 이건 뭐냐면.. 타입 자신입니다. 즉, 구체적인 힙 메모리의 데이터를 가리키는 것이 아니라, 데이터 영역에 존재하는 클래스 타입을 가리키는 것입니다.
(쉽게 이야기 하자면, 붕어빵 틀을 가리키는 것이예요. 그리고 그 붕어빵 틀의 타입을 타입.Type 이라고 표현합니다.)
그래서 최대한 간단히 설명드려볼려고 했지만, 어쨌든.. 해당 자리에는 self를 쓰셔야 하고, 일단 let을 lazy var로 선언하셔야할 것 같네요.
감사합니다. :)