iOS 기본 (SwiftUI)
[iOS - SwiftUI] some 키워드 (Opaque Types, body 프로퍼티)
jake-kim
2022. 7. 19. 22:03
* 패턴 매칭에서의 some 키워드 (optional unwraping에 사용되는 some 키워드는 이 포스팅 글 참고)
Opaque Types (불투명 타입)
- 불투명 타입 단어 그대로 리턴 타입의 유형을 감추는 방법
- protocol앞에 some 키워드를 붙여서 사용
- some + { 어느 protocol... }
- computed property와 method에만 사용이 가능
- 반환 타입을 구현하는 쪽에서 마음대로 정할 수 있는 방법
ex) SwiftUI에서는 some 키워드를 computed property인 body에 사용
- body 구현부에 들어가는 반환타입은 View 프로토콜을 준수하고 있으면 무엇이 오든 ok.
struct ContentView: View {
var body: some View {
Text("Example")
}
}
ex) 위 body 프로퍼티처럼 만들어보기
- some 키워드는 프로토콜과 같이 쓰므로 프로토콜 준비
protocol MyProtocol {}
- some 키워드를 사용하는 곳 구현부에 사용될 MyProtocol을 준수하는 Person 구현
class Person: MyProtocol {
let name: String
init(name: String) {
self.name = name
}
}
- some 키워드를 사용한 body 프로퍼티 정의
- MyClass().body.name 접근이 불가능한 특징이 존재
- opaque 타입은 반환 유형을 숨김으로써 사용하는 쪽에서 의존하지 못하도록 강제할 수 있는 장점이 존재 (모듈 간의 사용에서 의존관계 끊기)
class MyClass {
var body: some MyProtocol {
Person(name: "123")
}
}
print(MyClass().body) // "__lldb_expr_6.Person\n"
결론
- some 키워드를 쓰면 마치 generic 타입과 같이 유연한 코드 구현이 가능
- generic 타입은 파라미터를 넣어줄때 타입이 결정되는 반면에, opaque 타입은 특정 프로토콜을 준수하는 구현체를 반환하여 사용
// generic type
func add<T: Numeric>(a: T, b: T) -> T {
return a + b
}
- opaque 타입은 반환 유형을 숨김으로써 사용하는 쪽에서 의존하지 못하도록 강제할 수 있는 장점이 존재
- DIP(Dependency Inversion Principle)에서는 한쪽의 의존 관계를 갖지만, opaque타입을 사용하면 어느 의존관계도 생기지 않아 더욱 유연한 프로그래밍이 가능한 장점이 존재
* DIP 개념은 이전 포스팅 글인, 코드로 알아보는 SOLID - DIP(Dependency Inversion Principle, testable) 의존성 역전 원칙 참고

* 참고
https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html