Swift에서의 **self**는 인스턴스 자기 자신(self)을 나타냅니다. 클래스나 구조체, 열거형 등의 인스턴스 내부에서 해당 인스턴스를 참조하는 데 사용되는 예약어입니다.

예를 들어, 아래와 같이 클래스 내에서 **self**를 사용하여 인스턴스의 프로퍼티나 메소드에 접근할 수 있습니다:

class MyClass {
    var value: Int = 0
    
    func setValue(_ newValue: Int) {
        self.value = newValue // self를 사용하여 인스턴스의 프로퍼티에 접근
    }
    
    func printValue() {
        print("Value: \\(self.value)") // self를 사용하여 인스턴스의 프로퍼티에 접근
    }
}

**self**는 현재의 인스턴스를 참조하기 위해 사용되며, 해당 인스턴스의 프로퍼티나 메소드를 호출하거나 접근할 때 사용됩니다.

**weak self**는 클로저나 콜백 함수 내에서 **self**를 약한 참조로 캡처하는데 사용되는 것으로, retain cycle을 방지하고 메모리 누수를 예방하기 위한 목적으로 사용됩니다. 이 때 **self**는 해당 클로저나 콜백 함수를 둘러싸는 스코프에 있는 인스턴스를 나타냅니다.

self.프로퍼티명 // 클래스나 구조체 자신의 인스턴스에 속한 프로퍼티

여기서의 self 는 클래스나 구조체의 인스턴스 자신을 가리킨다. 그리고 self와 프로퍼티명을 구분해주는 .은 소속의 의미를 나타낸다.

인스턴스는 클래스 외부에서만 접근할 수 있기 때문에 클래스 내부에서는 어느 인스턴스에 할당된것인지 알기 힘들다. 이러한 이유때문에 인스턴스 이름 대신에 self 키워드를 사용해 자신의 인스턴스라는 것을 명시해준다.

self 키워드는 생략이 가능하며, 실제로 생략을 많이 한다. 하지만 만약 프로퍼티와 일반 변수의 이름이 같을 경우 구분을 위해 self 를 꼭 써줘야 한다.

https://velog.io/@junsuboy/Swift-self란