[Swift] Subscript


サブスクリプト


サブスクリプトは、設定者またはアクセス者のメソッドを実装することなく、タイプ内の要素にアクセスできるショートカット構文です.サブスクリプトは、複数実装され、伝達値のタイプを導出することによって適切なサブスクリプトを実行することができる.また、複数のパラメータを持つことができますが、通常はI/Oパラメータとして1つのパラメータを持つことはできません.

基本構文


サブスクリプトの基本構文は次のとおりです.
パラメータのタイプは、Intであってもよいし、他のタイプであってもよい.
subscript(index: Int) -> Int {
    get {
    	// 접근 - 서브스크립트의 결괏값을 반환
    }
    set(newValue) {
    	// 설정 - newValue값으로 설정
    }
}
サブスクリプトを読み取り専用に実装するには、2つの方法があります.
// 1번 방식 - set 구현 X
subscript(index: Int) -> Int {
    get {
    	// 서브스크립트 결괏값 반환 
    }
}

// 2번 방식 - get, set 구현 X
subscript(index: Int) -> Int {
	// 서브스크립트 결괏값 반환
}

struct Train {
    var line: Int = 1 // 호선
    var number: Int = 10000 // 전철번호
}

// 철도 회사 클래스
class Metro {
    var trains: [Train] = [Train]()  // 회사 소유 전철 배열
    var number: Int = 10000     // 전철번호
    
    // Train 인스턴스 생성 후 배열에 저장
    func addTrain(line: Int){
        let train: Train = Train(line: line, number: self.number)
        self.trains.append(train)
        self.number += 1
    }
    
    subscript(index: Int) -> Train? {   // nil도 반환할 수 있어서 옵셔널
        get {
            // 인덱스 값이 최대 전철번호보다 작은지 검사 -> 생성되지 않은 전철 접근하는 오류 방지
            if index < number {
                return self.trains[index-10000]
            }
            return nil
        }
        set(newValue) {
            guard var newTrain: Train = newValue else { return }
            var number: Int = index

        	// 인덱스 값은 전철번호보다 더 커질 수 없다.  
            if index > self.number {
                number = self.number
                self.number += 1
            }
            
            newTrain.number = number
            self.trains[number-10000] = newTrain
            
        }
    }
}

let seoulMetro: Metro = Metro()
seoulMetro.addTrain(line: 1)  // 호선 : 1, 전철번호 : 100000
seoulMetro.addTrain(line: 2)  // 호선 : 2, 전철번호 : 100001

// get
let firstTrain: Train? = seoulMetro[10000]
print("호선: \(firstTrain?.line), 전철번호: \(firstTrain?.number)")
// 출력 -> 호선: Optional(1), 전철번호: Optional(10000)

// set
seoulMetro[10000] = Train(line: 3)
print("호선: \(seoulMetro[10000]?.line), 전철번호: \(seoulMetro[10000]?.number)")
// 출력 -> 호선: Optional(3), 전철번호: Optional(10000)
Trainクラスのtrains配列は、set部分で出力される.

地下鉄10,000号線が3に変更されているのが見えます.
これにより、サブスクリプトはインスタンスの値に簡単にアクセスまたは設定できます.