관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - SwiftUI] some 키워드 (Opaque Types, body 프로퍼티) 본문

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) 의존성 역전 원칙 참고

DIP

* 참고

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

Comments