클래스, 구조체, 열거형에서 시퀀스의 멤버 요소에 접근하기 위한 바로가기 첨자로, 단일 타입에 여러 서브스크립트를 정의할 수 있다
let nums: [Int] = [1, 2, 3, 4]
nums[0] // 1
nums[1]
=> 여기서 []이 서브 스크립트
위를 참고했을 때 Int형을 index로 받고, 해당 index에 해당하는 element를 반환하는 것을 알 수 있다.
let sodeul = "Hello, Sodeul!"
sodeul[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])
}
}
=>
let sodeul = "Hello, Sodeul!"
sodeul[0] // Optional("H")
sodeul[100] // nil
기본으로 Argument Label을 _로 처리하지 않아도 Argument Label을 사용할 수 있다
ex) [key : 1] -> [1]
struct Stack {
var stack: [Int] = [0, 1, 2, 3, 4, 5]
subscript(index: Int) -> Int {
get {
return stack[index]
}
set {
stack[index] = newValue
}
}
}
=>
var stack: Stack = .init()
stack[0] // 서브스크립트 getter 접근
stack[1] = 2 // 서브스크립트 setter 접근
struct Stack {
static var stack: [Int] = [0, 1, 2, 3]
static subscript(index: Int) -> Int {
return stack[index]
}
}
오버라이딩 여부에 따라 static or class로 선언
Stack[0] // 0
Stack[1] // 1
위에서 이미 보여줬지만 다시 가져오면
extension String {
subscript(idx: Int) -> String? {
guard (0..<count).contains(idx) else {
return nil
}
let target = index(startIndex, offsetBy: idx)
return String(self[target])
}
}
이렇게 접근 가능
let sodeul = "Hello, Sodeul!"
sodeul[0] // Optional("H")
sodeul[100] // nil
extension Int {
enum Kind {
case negative, zero, positive
}
var kind: Kind {
switch self {
case 0:
return .zero
case let x where x > 0:
return .positive
default:
return .negative
}
}
}
=> Int에 새로운 중첩된 열거형 추가, 이 중첩된 열거형은 모든 Int값에서 사용될 수 있음
func printIntegerKinds(_ numbers: [Int]) {
for number in numbers {
switch number.kind {
case .negative:
print("- ", terminator: "")
case .zero:
print("0 ", terminator: "")
case .positive:
print("+ ", terminator: "")
}
}
print("")
}
printIntegerKinds([3, 19, -27, 0, -6, 0, 7])
// Prints "+ + - 0 - 0 + "