즉, self는 인스턴스가 가지고 있는 프로퍼티이다 → 메모리에 올라간 애를 의미
인스턴스 프로퍼티와 인스턴스 메소드를 가르킬때 사용한다
타입의 이름을 반복해서 쓰는 대신 현재 타입을 쓸 수 있도록 도와준다
클래스, 구조체, Enum 등에서 Self를 사용하면 그 타입을 가르킨다
그러니까 String, Int처럼 타입을 의미한다
타입프로퍼티와 타입메서드를 가르킬 때 사용한다
extension Storyboarded where Self: UIViewController {
static func getInstance(_ storyboardName: String? = nil) -> Self? {
let name = storyboardName ?? String(describing: self)
let storyBoard = UIStoryboard(name: name, bundle: Bundle.main)
return storyBoard.instantiateViewController(withIdentifier: String(describing: self)) as? Self
}
}
extension SecondVC {
// static 메소드로 하는 이유: 굳이 secondVC를 메모리에 올리지 않아도 secondVC를 호출할 수 있도록 한다
static func getInstance() -> Self? { //Self? -> 자기자신을 반환해야 한다(ViewController가 없을 수도 있으므로 optional)
let secondStoryBoard = UIStoryboard(name: "SecondVC", bundle: Bundle.main)
return secondStoryBoard.instantiateViewController(withIdentifier: "SecondVC") as? SecondVC
}
}
class SuperClass {
func f() -> Self {
return self
}
}
class SubClass: SuperClass {}
let x = SuperClass()
x.f()//SuperClass
let y = SubClass()
x.f()//SubClass