Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Clean Code
- 스위프트
- ribs
- HIG
- Xcode
- Protocol
- UICollectionView
- Human interface guide
- UITextView
- swiftUI
- 리펙터링
- Observable
- ios
- map
- MVVM
- 리팩토링
- clean architecture
- rxswift
- Refactoring
- RxCocoa
- swift documentation
- SWIFT
- 클린 코드
- 애니메이션
- tableView
- uitableview
- combine
- collectionview
- uiscrollview
- 리펙토링
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - SwiftUI] some 키워드 (Opaque Types, body 프로퍼티) 본문
* 패턴 매칭에서의 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
'iOS 기본 (SwiftUI)' 카테고리의 다른 글
[iOS - swiftUI] Text, kerning, tracking, Localization, ViewModifier, Text ViewModifiers 개념 (0) | 2022.07.30 |
---|---|
[iOS - swiftUI] View Protocol (뷰 프로토콜) (0) | 2022.07.29 |
[iOS - swiftUI] SwiftUI의 기본 - 목차 (0) | 2022.07.28 |
[iOS - SwiftUI] 앱의 구조 (App, Scene, WindowGroup, ContentView) (0) | 2022.07.27 |
[iOS - swiftUI] TextField, onSubmit, textFieldStyle, @FocusState TextField ViewModifier 개념 (0) | 2022.07.25 |
Comments