티스토리 뷰
Swift언어에서는 KVC, Key-Value-Coding을 지원하는데요. KVC란 객체의 값을 직접적으로 가져오는 것이 아닌, Key 또는 KeyPath 를 이용해서 간접적으로 접근해서 읽고 쓸 수 있는 기능입니다.오늘은 Swift언어로 구현한 struct, class structure의 멤버변수, 상수 값들을 WritableKeyPath, KeyPath으로 접근하고, 읽기 쓰기하는 연습을 해보겠습니다.
Swift KVC(Key-Value Coding) KeyPath 사용 전, class, struct 구성하기
먼저, struct, class 몇개를 구성했습니다. Baby 구조체는 age, height 변수와 cat: Cat, dog: Dog를 갖습니다.
class 타입의 Cat, struct 타입의 Dog도 구성했어요. 이어서 KeyPath로 얘네 멤버들을 접근해보도록 하겠습니다.
Swift KVC(Key Value Coding), WritableKeyPath, KeyPath 접근해서 사용방법
먼저 class인 cat, struct인 dog, baby, 의 인스턴스를 만들었습니다. 변수명은 좀 성의없게 짓긴했는데, keyPath, writableKeyPath를 사용하는 것에 집중해봐요. 🤤
KeyPath 접근은 인스턴스에 배열처럼 [keyPath:] 첨자를 사용해서 접근합니다. 그리고 안에 ﹨.{멤버 명} 을 적어주면 됩니다.
예를들어 baby[keyPath: ﹨.age]는 baby의 age값을 출력할 수 있어요.
이때 접근한 값이 변수인 경우, 첨자(subscript) 접근을 한 후, 값을 변경할 수도 있습니다. 변경 후에 baby의 age, height를 출력하면 변경된 값이 출력되는 것을 볼 수 있죠. 이렇게 keyPath 사용해서 읽기 쓰기가 가능한데요.
그러면 이번에는 keyPath, WritableKeyPath, ReferenceWritableKeyPath(referenced 멤버 접근 타입)를 따로 상수로 받아서 원할때마다 받아놓은 KeyPath로 첨자접근을 해서 값을 쓰고 읽어보겠습니다.
WritableKeyPath, KeyPath 상수로 정의 후 원할때 읽기 쓰기 사용하기
이번에는 keyPath를 첨자에 직접적으로 적어서 접근하는것이 아닌 사전에 KeyPath를 담아두었다가 그 상수값을 첨자에 넣어서 사용해볼거에요. 차이점이 보이시나요? 해당 타입에 대한 설명이 추가되어있습니다. ﹨.age 가 아닌 ﹨Baby.age로 말이죠.
그 이유는 앞서 직접적으로 첨자 내에 KeyPath를 명시할때는 해당 타입이 무엇인지 타입 추론이 가능했지만, 이렇게 별도로 KeyPath를 담을때에는 타입 추론이 불가능하기 때문에 명확한 타입을 앞에 추가로 붙혀주는 것입니다.
이렇게 위와 같이 KeyPath를 담아보다보면 각각의 타입이 다른 것을 알 수 있습니다. 이때 값 변경이 불가한 멤버에 대한 KeyPath는 "Writable" 키워드가 붙지 않아요. 말 그대로 쓰기가 불가능함을 의미하는 것입니다. 즉, KeyPath<Baby, Int> 타입은 쓰기가 불가능한 멤버에 접근하는타입, WritableKeyPath<Baby, Double>, ReferenceWritableKeyPath<Baby, Int>는 읽기, 쓰기가 모두 가능한 겁니다.
또한 KeyPath 우측에 정의되는 두개의 타입은 차례대로 <{첨자 접근하는 대상 타입}, {실제 읽거나 쓰고자 하는 멤버의 타입}> 이 됩니다. 예를들어, WritableKeyPath<Baby, Int>는 Baby[keyPath:] 로 접근을 하고, Int타입의 멤버를 읽고 쓰는데 사용이 가능한 것입니다. 이제 이렇게 정의한 keyPath들을 사용해보겠습니다.
38 ~ 44행) 위와 같이 첨자에 직접 keyPath를 명시할 수도 있지만
48 ~ 55행) 따로 받아둔 KeyPath, WritableKeyPath를 이용해서 멤버를 접근할 수 도 있었습니다. baby[keyPath: babyCatKeyPath].age 처럼 keyPath로 접근한 멤버의 하위 멤버에 접근할 수도 있어요. Writable이 붙은 KeyPath로 접근한 경우, 읽기 뿐만 아니라 쓰기도 가능한 것을 볼 수 있습니다. 위 코드의 출력 결과는 어떻게 될까요? 아래를 보시면 알 수 있습니다.
* 56번 라인 print 설명은 "baby's cat : " 이지만.. 실제 출력 값은 baby's cat age입니다. 오타인데 이해 부탁드립니다. age를 출력하는 거에요. 😢
오늘은 Swift언어의 KVC 기능을 활용해서 클래스, 구조체 인스턴스의 멤버를 접근하고, 읽고, 쓰는 방법을 연습해보았습니다. WritableKeyPath, ReferenceWritableKeyPath와 같이 Writable이 붙으면 해당 keyPath로 접근 시 읽기뿐만 아니라 쓰기도 가능했습니다. Writable이 붙지 않는 KeyPath 타입은 읽기만 가능했습니다.
관련해서 의견이나 질문이 있으시다면 언제든 댓글 부탁드립니다. 감사합니다!
'iOS 개발 > iOS 개발 팁' 카테고리의 다른 글
iOS TDD, UnitTest UITest Target 생성 및 테스트코드 작성방법 (0) | 2023.01.24 |
---|---|
Structured Concurrency, async let, TCA API 요청 간 적용방법 (0) | 2022.10.30 |
Swift 5.1, Opaque Type 문법, protocol 타입 반환 간 사용방법 (0) | 2022.10.11 |
Xcode 팁, 한 화면에 다수의 editor 창 보이게 설정하는 방법 (0) | 2022.10.02 |
iOS SPM, Swift Package Manager 방식 라이브러리 추가, 사용방법 (0) | 2022.09.18 |
- Total
- Today
- Yesterday
- SwiftUI
- Swift 알고리즘
- 프로그래머스
- Protocol
- 백준swift
- 부스트코스
- publisher
- swift reduce
- Collection
- 자연어처리
- 개발자문서
- 컬렉션
- ios
- 스위프트
- 프로토콜
- 백준알고리즘
- 알고리즘
- 알고리즘문제
- swift 기초
- swift string
- swift 문자열
- createML
- swift알고리즘
- swift문제
- uikit
- 김프매매
- CoreML
- swift
- swift언어
- 프로그래머스swift
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |