반응형
서브스크립트란 무엇일까요?
코드에서 뗄레야 뗄수없는 이 간편한 기능은 바로 colectionType[i] 으로 사용하는 [i] 이녀석입니다.
서브스크립트란 콜렉션, 리스트, 시퀀스등의 집합의 특정 개별요소에 접근할 수 있는 문법입니다.
Array 타입엔 [index]로, Dictionary 타입엔 [key]등으로 접근할 수 있습니다.
따로 구현없이 사용할 수 있었던 이유는, 이미 해당 타입에 서브스크립트가 구현되어있기 때문입니다 ㅎ
구조
subscript(index: Int) -> Int {
get {
// 적절한 반환 값
}
set(newValue) {
// 적절한 set 액션
}
}
이런 구조로 되어있는데, 서브스크립트는 읽고 쓰기 및 읽기전용만 가능하다는 점이 특징입니다.
get, set을 별도로 입력하지않으면 get으로 동작해 읽기전용으로 선언됩니다.
예제
struct SquareRoot {
let num: Int
subscript(index: Int) -> Int{
var temp = num
for _ in 1...index - 1 {
temp *= num
}
return temp
}
}
var test: SquareRoot = SquareRoot(num: 2)
print(test[6])
읽기전용 서브스크립드를 제작해 보았습니다.
SquareRoot의 인스턴스 생성시 입력한 num을 index만급 제곱한 수를 출력합니다.
위에서 입력한 값은 2의 6승이니 128이 출력되었군요.
이를 활용해서 다차원 행렬을 arr[][][][]로 표현하는게 아니라,
구조체나 클래스로 만들어서 보다 손쉽게 접근할 수 있습니다.
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
공식문서의 예제를 그대로 가져왔습니다.
var matrix = Matrix(rows: 2, columns: 2)
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
본래 array로 구현했다면 arr[0][1] = 1.5, arr[1][0] = 3.2로 선언했어야 됬겠죠? ㅎㅎ
indexIsValid를 통해서 해당 배열값을 꺼내기 전에 유효한 범위인지도 체크할 수 있네요.
꼼꼼합니다 ㄷㄷ
반응형
'Language > Swift' 카테고리의 다른 글
Swift GCD(Grand Central Dispatch) [2] - DispatchQueue (0) | 2021.03.22 |
---|---|
Swift GCD(Grand Central Dispatch) [1] - 멀티스레딩 기초 (0) | 2021.03.22 |
Swift 제네릭 (Generic) (0) | 2021.03.19 |
Swift 프로토콜 지향 프로그래밍 (POP) (0) | 2021.03.17 |
Swift 접근제어 (0) | 2021.03.16 |