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를 응용하는 방법이 있겠지만, 그건 추후에 발견하면 추가하도록 하겠습니다.
'TIP' 카테고리의 다른 글
[Swift/ TIP] 앱 이름 변경하기 (+Localization) (0) | 2023.07.21 |
---|---|
[Swift/ TIP] 앱 추적 투명성 권한 요청 (App Tracking Transparency) (0) | 2023.07.21 |
[Swift/ TIP] Alert를 사용해, 앱 설정창으로 이동하기 (0) | 2023.07.21 |
[Swift/ Tip] 스크린의 크기를 구해보자 (UIScreen.main is deprecated) (0) | 2023.07.18 |
[Swift/ Tip] 한 버튼에서 2가지 동작을 사용해보자 (0) | 2023.07.15 |