macOS Catalina 공식 버전 출시 이후로 늦었지만 Swift 5.1의 변화점들에 대해 공부하고 있습니다. 이 글을 시작으로 Swift 5.1에서 뭐가 바뀌었는지 눈에 띄는 것들을 글로 정리해보고자 합니다.
첫 글은 SE-0068 Expanding Swift Self to class members and value types에서 소개된 Self
의 기능 확장에 대한 이야기입니다.
뭐 아시겠지만 Self
는 원래 자기 자신의 동적 클래스(dynamic class)를 가리키는 키워드입니다.
우선 예제를 살펴봅시다.
class MyClass {
class var name: String {
return "unknown name"
}
func show() {
print("My name is \(MyClass.name)")
}
}
class AnotherClass: MyClass {
override class var name: String {
return "another name"
}
}
let obj = AnotherClass()
obj.show() // "unknown name"
위 예제는 주석에도 써놨다시피 AnotherClass
타입 인스턴스의 show()
메서드는 "unknown name"을 콘솔에 표시합니다. 당연합니다. MyClass
클래스에 정의된 name
이라는 클래스 변수를 출력하게 만들어졌으니까요.
하지만 우리는 MyClass
의 자식 클래스에서 show()
메소드를 그대로 사용하면서 클래스 변수인 name
만을 오버라이드 하고 싶습니다. 그렇다면 어떻게 해야 할까요?
Swift 5.1에서는 이를 상속받은 클래스에서 정의하는 class 멤버(혹은 static 멤버)를 참조할 수 있도록 Self
키워드에 능력이 추가됩니다. 따라서 위의 MyClass
의 show()
메서드를 아래와 같이 수정할 수 있습니다.
func show() {
print("My name is \(Self.name)")
}
self
가 아닌 Self
입니다. 첫 글자가 대문자인 것에 주의합시다.
이렇게 하면 이제 AnotherClass
의 인스턴스에서 show()
메소드를 호출하면 의도대로 "another name"이 콘솔에 표시됩니다. 이런 식으로 Self
키워드를 사용할 수 있습니다.
Self는 이외에도 여러 용도로 활용됩니다. 아래처럼 상속 대신 프로토콜에 맞춰 구현한 구조체(struct)도 static 멤버 액세스를 하기 위해 Self
를 사용할 수 있습니다.
protocol MyType {
static var name: String { get }
func show()
}
extension MyType {
func show() {
print("My name is \(Self.name)")
}
}
struct John: MyType {
static var name = "John"
}
struct Conrad: MyType {
static var name = "Conrad"
}
let j = John()
j.show() // "John"
let c = Conrad()
c.show() // "Conrad"
extension을 이용해 MyType의 show() 메서드를 직접 구현한 경우 이 녀석도 실체를 구현하는 값을 참조하도록 Self
키워드를 사용한 예제입니다. 기존의 경우... 방법이 있을까요? :D
'기술적인 이야기 > 애플 플랫폼 개발' 카테고리의 다른 글
[Swift 5.1] 초기화 없는 배열 생성하기 (SE-0245) (0) | 2019.10.24 |
---|---|
[Swift 5.1] Opaque Result Types 그리고 some (SE-0244) (0) | 2019.10.18 |
[Swift 5.1] 구조체 생성자에 기본값 지원 (SE-0242) (0) | 2019.10.17 |
[Swift 5.1] 순서가 있는 콜렉션끼리 차이점 비교하기 (SE-0240) (0) | 2019.10.15 |
Swift 5에서는 뭐가 바뀌었을까? (0) | 2019.04.07 |
댓글