빙수왕의 개발일지

struct의 variable들을 array처럼 쓸 수는 없을까? 본문

개발/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인자로 넣어주면 배열처럼(?) 사용 가능하다.