728x90
서브스크립트(Subscripts)
- Class,Struct,enum 스크립트를 정의해 사용, 콜렉션,리스트, 시퀀스등(서브스크립트) 집합의 특정 멤버 엘리먼트에 간단하게 접근할 수 있음
- 서브 스크립트를 이용한다면 추가적인 메소드 없이 특정 값을 할당할거나 가져올 수 있음
- 예시
- 배열 인스터스의 특정 엘리먼트는 someArray[index]문법
- Dictionary instance의 특정 엘리먼트는 someDictionary[key]로 접근할 수 있음
- 하나의 타입에 여러 서브스크립트로 정의 할 수 있고 Overload도 가능
var myArray = [1, 2, 3, 4, 5]
// 서브스크립트를 사용하여 인덱스 0의 값을 가져옴
let firstElement = myArray[0] // 1
// 서브스크립트를 사용하여 인덱스 1의 값을 변경함
myArray[1] = 10 // [1, 10, 3, 4, 5]
// 서브스크립트를 사용하여 범위로 값을 가져오거나 변경함
let subArray = myArray[1...3] // [10, 3, 4]
myArray[2...3] = [20, 30] // [1, 10, 20, 30, 5]
서브스크립트 문법(Subsript Syntax)
- 서브스크립트 선언 문법은 인스턴스 메소드와 계산된 프로퍼티를 선언하는 것과 비슷
- 인스턴스 메소드와 차이점
- 서브스크립트는 읽고-쓰기 혹은 읽기만 가능
- 계산된 프로퍼티 방식과 같이 setter, getter방식을 따름
subscript(index: Int) -> Int {
get {
// 적절한 반환 값(서브스크립트가 값을 가져올 때 실행할 코드)
}
set(newValue) {
// 적절한 set 액션(서브스크립트가 값을 변경할 때 실행할 코드)
}
}
subscript(index: Int) -> Int {
// 적절한 반환 값
}
// 읽기 전용으로 선언한 서브스크립트의 (예)
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" 출력
- 서브스크립트의 set에 대한 인자 값을 따로 지정하지 않으면 default로 newValue를 사용
- 읽기전용으로 선언하면 get,set을 지우고 따로 지정하지 않으면 get으로 동작하게 되어 읽기전용
서브스크립트 사용(Subscript Usage)
- 사전에서 서브스크립트 사용 예
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4] numberOfLegs["bird"] = 2
numberOfLegs값은 타입 추론에 의해 [String: Int]형을 갖음
<aside> ❗ 사전의 반환 값은 옵셔널. 그 이유는 사전에 특정 키 값이 없는 경우가 있을 수 있고, 특정 키 값을 nil로 설정할 수 있기 때문
</aside>
서브스크립트 옵션(Subscript Options)
- 서브스크립트는 입력 인자 숫자에 제한 ❌
- 입력 인자(argument)의 타입과 반환(return)타입 제한 ❌
- in-out parameter or default parmeter value 제공 ❌
- 서브스크립트는 오버로딩도 허용
- 인자형,반환형에 따라 원하는 수만큼의 서브스크립트 선언⭕
- 예시(다차원 행열 선언후 접근)
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
}
}
}
Matrix(rows: 10, columns: 20)
모르는 단어
시퀀스(Sequence)
- 순서가 있는 값들의 집합을 나타내는 프로토콜
- Array,Dictionary,Set,String등 타입을 포함한 컬렉션 Type
- Iterator Protocal이라는 프로토콜을 구현하는 Iterator을 사용하여 순서대로 값을 생성
이터레이터(Iterator)
- 값의 시퀀스를 생성하고 순서대로 하나씩 가져 올 수 있음
타입 추론
- Swift에서 자동으로 타입을 추론하여 정해줌
728x90
'기타 > Today I Learned' 카테고리의 다른 글
[TIL] Swift 문법 초기화(Initialization) - 1 (0) | 2023.05.10 |
---|---|
[TIL] Swift 문법 상속(Inheritance) (0) | 2023.05.05 |
[TIL] Swift 문법 메소드(Methods) (0) | 2023.04.28 |
[TIL] Swift 문법 클래스와 구조체 (0) | 2023.04.27 |
[TIL] Swift 문법 열거형(Enum) (0) | 2023.04.25 |