Danny의 iOS 컨닝페이퍼
article thumbnail

subscript란?

공식문서에서는 클래스, 구조체, 열거형 등 시퀀스의 멤버 요소에 접근할 수 있는 기능(문법)이라고 합니다.

 

공식문서 에 문법에 대한 자세한 내용은 나와있으니, 문법은 여기서 참고합시다!

 

다시 설명하면 클래스, 구조체, 열거형 등에서도

배열이나 콜렉션에서 사용되는 "[]" subscript 문법(첨자)을 통해 접근할 수 있게 도와준다네요.

 

그리고 subscript을 사용자의 요구사항에 맞게 정의할 수 있다고 하는데,

어떤 방식으로 사용할 수 있는지 간단히 알아봅시다.

 

 

사용자가 만든 모델에 쉽게 접근 가능

먼저, 이름과 나이로 간단한 모델(Model)을 만들어 줬고

클래스인 ModelManger를 통해 모델 데이터를 사용하기 편리하게 만들어 줬습니다.

 

추가로 subscript 문법을 사용해서 "[]" 첨자를 사용하여 modelList에 접근 가능하게 정의해 줬습니다.

struct Model {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}


class ModelManager {
    
    private(set) var modelList: [Model] = []
    
    init() {
        modelList = [
            Model(name: "Daniel", age: 33),
            Model(name: "Taylor Swift", age: 24),
            Model(name: "The Beatles", age: 54),
            Model(name: "Luke Combs", age: 36),
            Model(name: "Noah", age: 34),
            Model(name: "Billie Eilish", age: 26),
            Model(name: "Morgan Wallen", age: 28),
        ]
    }
    
    func numberOfRowsInSection(_ section: Int) -> Int {
        return modelList.count
    }
    
    // 👉 subscript 문법을 통하여 ModelListManager 클래스의 객체에서 "[]" 첨자를 사용 가능하게 정의함
    // modelList 인덱스에 접근할 수 있게 만들어 줌
    subscript(index: Int) -> Model {
        return modelList[index]
    }
}

 

일단, 당연히 ModelManger 객체에서 "." 점 문법으로도 접근할 수도 있겠죠.

var modelManager = ModelManager()
 
modelManger.modelList[0]  // Model(name: "Daniel", age: 33)
modelManger.modelList[1]  // Model(name: "Taylor Swift", age: 24)
modelManger.modelList[2]  // Model(name: "The Beatles", age: 54)
...

 

👉 하지만, 만들어둔 subscript로 접근하여 사용하면, 조금 더 깔끔한 코드가 완성이 됩니다!!!

var modelManager = ModelManager()
 
modelManger[0]  // Model(name: "Daniel", age: 33)
modelManger[1]  // Model(name: "Taylor Swift", age: 24)
modelManger[2]  // Model(name: "The Beatles", age: 54)
...

 

이과 같이 TableView DataSource에 깔끔하게 사용가능 하겠죠!

class TableViewCell: UITableViewCell {

    static let identifier = "cell"
    
    var model: Model? {
        didSet {
            guard let model = model else { return }
            nameLabel.text = model.name
            ageLabel.text = String(model.age)
        }
    }
}

class ViewController: UIViewController, UITableViewDataSource {

    var modelManager = ModelManager()	

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return modelManager.numberOfRowsInSection(section)
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell
        
        // 👉 subscript로 접근하여 modelList의 인덱스에 접근하여 사용
        cell.model = modelManager[indexPath.row]
        return cell
    }
}

 

 

마무리

일단, subscript는 예전에 문법으로만 공부했었지, 정확히 어떻게 사용되고 응용할 방법을 생각도 안 해봤는데,

 

소스들을 찾아보다가 subscript를 사용하여 코드를 깔끔하게 정리하는 걸 보고 공유하고 싶어서 이렇게 글을 써봤습니다.

 

다른 여러 방식으로도 subscript를 응용하는 방법이 있겠지만, 그건 추후에 발견하면 추가하도록 하겠습니다.

 

 

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!