질문 이력:
서브스크립트는 스위프트에서 컬렉션 및 데이터 구조와 안전하게 작업할 수 있도록 도입되어, 직관적인 대괄호 구문을 사용하여 요소에 접근할 수 있게 합니다.
문제:
서브스크립트와 메서드, 계산된 속성 간의 혼동, 그 사용 영역 및 서브스크립트를 컬렉션이 아닌 데이터에 접근하는 데 잘못 사용하는 경우.
해결책:
서브스크립트는 대괄호를 통해 객체의 요소에 접근을 제공하는 특별한 메커니즘입니다. 이는 읽기 전용 또는 읽기-쓰기 가능하며, Int뿐만 아니라 String이나 사용자 정의 타입과 같은 모든 유형의 매개변수를 지원합니다.
코드 예제:
struct Matrix { private var data: [[Int]] init(rows: Int, columns: Int) { data = Array(repeating: Array(repeating: 0, count: columns), count: rows) } subscript(row: Int, column: Int) -> Int { get { data[row][column] } set { data[row][column] = newValue } } } var matrix = Matrix(rows: 2, columns: 2) matrix[0, 1] = 5 print(matrix[0, 1]) // 5
주요 특징:
서브스크립트가 여러 개의 매개변수를 가질 수 있습니까?
예, 서브스크립트는 어떤 매개변수 조합과 유형(tuple 등)도 받을 수 있습니다.
코드 예제:
// 위의 Matrix 예제를 참조하세요. 서브스크립트는 (row: Int, column: Int)입니다.
읽기 전용 서브스크립트를 구현할 수 있습니까?
예, set을 선언하지 않으면 서브스크립트는 읽기 전용이 됩니다.
코드 예제:
struct ReadOnlyArray { private let items = [1, 2, 3] subscript(index: Int) -> Int { return items[index] } }
서브스크립트와 계산된 속성의 차이점은 무엇입니까?
계산된 속성은 항상 고정된 이름을 가지며 매개변수를 받지 않습니다. 서브스크립트는 가변 인덱스를 통해 접근할 수 있어 컬렉션 구조를 흉내 냅니다.
커스텀 구조체에서 서브스크립트를 사용해 전역 상태를 변경하여 배열의 단순 요소에 접근할 때 예상치 못한 부작용을 발생시킴.
장점:
단점:
구조체 내부의 비공식 배열과만 작업하기 위해 서브스크립트를 사용하며, 범위 초과 처리를 nil 반환으로 구현함.
장점:
단점: