Self vs self

라무·2023년 8월 9일

self(소문자)

🔥 자기 자신을 가르키는 프로퍼티
  1. 인스턴스 내부에 같은 이름으로 선언된 변수들이 있다면, 좀 더 명확히 명시해준다
  2. 값 타입 인스턴스 자체의 값을 치환하기 위해서 사용된다

즉, self는 인스턴스가 가지고 있는 프로퍼티이다 → 메모리에 올라간 애를 의미

인스턴스 프로퍼티와 인스턴스 메소드를 가르킬때 사용한다

Self(대문자)

🔥 타입에 해당한다

타입의 이름을 반복해서 쓰는 대신 현재 타입을 쓸 수 있도록 도와준다

클래스, 구조체, Enum 등에서 Self를 사용하면 그 타입을 가르킨다

그러니까 String, Int처럼 타입을 의미한다

타입프로퍼티와 타입메서드를 가르킬 때 사용한다

예시1

  • 여기서 Self(대문자)는 UIViewController 혹은 storyboarded도 된다
    • protocol도 type으로 볼 수 있으니까
  • 그리고 self는 메모리에 올라간 클래스를 의미한다
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
    }
}

예시2

  • 여기서 Self는 SecondVC를 의미한다
    • SecondVC 타입을 확장하는 부분이니까
    • 클래스, 프로토콜은 전부 타입으로 생각하면 된다
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
    }
}

예시3

class SuperClass {
	func f() -> Self {
		return self
	}
}

class SubClass: SuperClass {}

let x = SuperClass()
x.f()//SuperClass

let y = SubClass()
x.f()//SubClass

참고한 블로그

[Swift] Self와 self의 차이

profile
ios 개발을 하고있는 라무의 사적인 기술 블로그

0개의 댓글