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
- ribs
- clean architecture
- SWIFT
- uiscrollview
- Xcode
- 스위프트
- combine
- 애니메이션
- HIG
- Clean Code
- 클린 코드
- collectionview
- Human interface guide
- RxCocoa
- Protocol
- 리팩토링
- tableView
- 리펙토링
- UICollectionView
- rxswift
- uitableview
- UITextView
- map
- Observable
- 리펙터링
- MVVM
- swiftUI
- ios
- Refactoring
- swift documentation
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] KeyPath, map(\.) 연산자 본문
KeyPath란?
- 특정 루트 유형(class 타입, struct 타입)에서 value type으로의 참조를 의미
- Property의 reference값을 의미 (c에서의 포인트 개념과 유사)
* 구체적인 KeyPath, KVC, KVO 개념은 다음 포스팅 글 참고
KeyPath 사용 방법
- KeyPath 참조 얻어내는 방법
let userNameKeyPath = \\User.name
print(userNameKeyPath) // Swift.KeyPath<ExSyntax.ViewController.User, Swift.String>
- KeyPath 참조를 통해 값에 접근하는 방법
let userNameKeyPath = \\User.name
print(userNameKeyPath) // Swift.KeyPath<ExSyntax.ViewController.User, Swift.String>
let user1 = User(name: "jake", email: "a@a.com", phoneNumber: "010-1111-5678")
let user = user1[keyPath: userNameKeyPath]
print(user) // jake
- 객체 정의 자체 내에서 KeyPath를 사용할 때는 자기 자신의 클래스 이름 생략이 가능
class User {
func getName() -> String {
return self[keyPath: \\.name]
}
}
Swift 5.2+, KeyPath를 통한 편리한 property 접근
- KeyPath를 통해 Higher Order Function을 더욱 편리하게 사용 가능
- map
// sample data let user1 = User(name: "jake", email: "a@a.com", phoneNumber: "010-1111-5678") let user2 = User(name: "kim", email: "b@b.com", phoneNumber: "010-2222-5678") let user3 = User(name: "jane", email: "c@c.com", phoneNumber: "010-3333-5678") let users = [user1, user2, user3] // KeyPath를 사용하지 않은 경우 let names = users.map { $0.name } // KeyPath를 사용한 경우 let namesUsingKeyPath = users.map(\.name) // users.map { $0[keyPath: \\User.email] } 와 동일
- filter
// filter에서 KeyPath를 통한 equal 연산자 정의 func ==<T, V: Equatable>(lhs: KeyPath<T, V>, rhs: V) -> (T) -> Bool { return { $0[keyPath: lhs] == rhs } } // KeyPath를 사용하지 않은 경우 let engineers = users.filter { $0.job == .engineer } // KeyPath를 사용한 경우 let namesIncludeJUsingKeyPath = users.filter(\\.job == .engineer)
* 참고
'iOS 응용 (swift)' 카테고리의 다른 글
Comments