개발/iOS
struct의 variable들을 array처럼 쓸 수는 없을까?
빙수킹
2021. 3. 3. 02:10
문제상황: 나의 모든 금융 보유 리스트를 출력하려고 한다. (ex. 계좌, 카드, 보험 등..)
아래 토스 화면 처럼!

그래서 json을 임의로 상상해서 만들었음. 아래처럼 내려오지 않을까?
{
"accounts": [
{
"accountName": "신한 주거래 우대통장",
"amount": "3,391,392",
"unit": "원"
},
{
"accountName": "신한 첫급여 드림 적금",
"amount": "3,391,392",
"unit": "원"
},
{
"accountName": "한달애저금통",
"amount": "3,391,392",
"unit": "원"
},
{
"accountName": "개인형IRP",
"amount": "3,391,392",
"unit": "원"
}
],
"cards": [
{
"cardName": "하이마트Mobile-현대카드M",
"amount": "17,950",
"unit": "원"
}
]
}
그러면 TableView에서 뿌려줄 때.. 계좌 / 카드 별로 섹션을 나눠야 하기 때문에 아마 case문이 들어갈것이다. 대충 아래처럼...
하지만 "case 0은 accounts이고 case 1은 cards임"이 어떻게 보면 내맘대로 넣어버린거지 않은가?? 하드코딩처럼..
switch section {
case 0:
return list?.accounts.count ?? 0
case 1:
return list?.cards.count ?? 0
}
이게 싫은게 문제였다.
그래서일단 enum을 만들었다. case 0, 1이라는 숫자에 의미를 가질 수 있도록.
enum FinanceCategory: Int, CaseIterable {
case Account = 0
case Card
var title: String {
switch self {
case .Account:
return "계좌"
default:
return "카드"
}
}
}
그리고 테이블뷰에서는 아래처럼 case문을 없앨 수 있었다.
// MARK: - tableView
extension FirstViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return FinanceCategory.allCases.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return FinanceCategory(rawValue: section)?.title
}
하지만 두번째 문제.. 실제 json 데이터 내부에 접근할 때는???? 어떻게 해야함?? 결국은 case문을 써야만 하지 않을까?
그러니까 내가 하고싶었던거는
아래와 같은 json 데이터를 받는 struct에서
section 0 - accounts
section 1 - cards 를 의미있게 매핑하고 싶었다. (FinanceInfo struct의 인스턴스 변수들이 배열처럼 인덱스로 찾아졌으면 했다)

그래서 내가 찾은 그나마 최선의 방법은.. subscript이다.

그리고 테이블뷰에서는 아래처럼 section을 subscript인자로 넣어주면 배열처럼(?) 사용 가능하다.
