[Swift] 서브스크립트

김태형·2023년 3월 27일
0

Swift

목록 보기
16/22
post-thumbnail

이번 글은 서브스크립트에 대해 작성해보겠다. 지금까지 공부했던 것 중에 뭔가 가장 애매모호했던,,? 느낌이었다.


서브스크립트

클래스, 구조체, 열거형에는 컬렉션, 리스트, 시퀀스 등 타입의 요소에 접근하는 단축 문법인 서브스크립트를 정의할 수 있다.

타입의 요소란 쉽게 말해서 대괄호로 감싼 인덱스와 같은 개념으로 생각하면 될 것 같다.

  • 인스턴스의 이름 뒤에 대괄호로 감싼 값을 통해 접근할 수 있다
    --> 인덱스처럼(인덱스에) 접근이 가능함!

  • subscript 키워드를 통해 정의

  • 연산 프로퍼티나 인스턴스 메소드 문법과 유사

  • 정의하는 코드는 각 타입의 구현부 또는 타입의 익스텐션 구현부에 위치함

  • 별도의 설정자(setter) 또는 접근자(getter) 등을 구현하지 않아도 인덱스를 통해 값을 설정하거나 가져올 수 있음 (대괄호)

    ex. someArray의 index를 통해 해당 인덱스의 값에 접근하고 싶을 때
    —> someArray[index] : 이렇게 표현하는 것이 서브스크립트임

subscript(index: Int) -> Int {
    get {
        //서브스크립트 결괏값 반환
    }
    set(newValue) {
        //설정자 역할 수행
    }
}


struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \\(threeTimesTable[6])") 
// six times three is 18
// 인덱스 값을 이용하여 계산을 진행하였다. (인덱스를 사용)

  • 자신이 가지는 시퀀스나 컬렉션, 리스트 등의 요소를 반환하고 설정할 때 주로 사용
  • 여러 개의 매개변수를 가질 수 있음
  • 입출력 매개변수는 가질 수 없음
struct Student {
    var name: String
    var number: Int
}

class School {
    var number: Int = 0
    var students: [Student] = [Student]()
    
    func addStudent(name: String) {
        let student: Student = Student(name: name, number: self.number)
        self.students.append(student)
        self.number += 1
    }
    
    func addStudents(names: String...) {    //들어올 매개변수의 개수가 불확실할 때 ... 사용
        for name in names {
            self.addStudent(name: name)
        }
    }
    
    subscript(index: Int = 0) -> Student? {    //서브스크립트를 정의하면 인덱스처럼 사용할 수 있게 됨
        if index < self.number {
            return self.students[index]
        }
        return nil
    }
}

let highSchool: School = School()
highSchool.addStudents(names: "Ted", "DY", "JJ", "JW")

let aStudent: Student? = highSchool[1]    //구조체 형식이기 때문에 인덱스를 달아주지 않는 이상 값을 추출할 수 없음
										  //서브스크립트를 통해 인덱스를 지정해주어 값을 할당 받을 수 있게 됨!
print("\(aStudent?.number) \(aStudent?.name)")  //Optional(1) Optional("DY")
print(highSchool[]?.name)   //매개변수 기본값 사용 -> Optional("Ted")

사용 예시

  • String을 배열처럼 [index]로 접근하고 싶을 때 사용!
let ted = "Hi, Ted!"
ted[0]    //error!! (해당 서브스크립트를 사용할 수 없음)


extension String {    //문자열을 인덱스로 추출할 수 있는 서브스크립트
    subscript(idx: Int) -> String? {
        guard (0..<count).contains(idx) else {
            return nil
        }
        let target = index(startIndex, offsetBy: idx)
        return String(self[target])
    }
}


ted[0]    //Optional("H")

그래도 계속 보니깐 어느 정도는 이해가 되는데,, 익숙해지고 활용하기 위해서는 더욱 많이 봐야 할 것 같다.



[출처] 스위프트 프로그래밍 (야곰), 야곰의 스위프트 기초문법 강좌, 개발하는 정대리 스위프트 강좌

0개의 댓글