프로그래밍iOS/Swift 개발자

스위프트에서 서브스크립트가 어떻게 작동하는지, 선언 및 호출 규칙은 무엇인지, 일반 메서드나 계산된 속성과의 차이점은 무엇인지 설명하세요.

Hintsage AI 어시스턴트로 면접 통과

답변.

질문 이력:

서브스크립트는 스위프트에서 컬렉션 및 데이터 구조와 안전하게 작업할 수 있도록 도입되어, 직관적인 대괄호 구문을 사용하여 요소에 접근할 수 있게 합니다.

문제:

서브스크립트와 메서드, 계산된 속성 간의 혼동, 그 사용 영역 및 서브스크립트를 컬렉션이 아닌 데이터에 접근하는 데 잘못 사용하는 경우.

해결책:

서브스크립트는 대괄호를 통해 객체의 요소에 접근을 제공하는 특별한 메커니즘입니다. 이는 읽기 전용 또는 읽기-쓰기 가능하며, 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] } }

서브스크립트와 계산된 속성의 차이점은 무엇입니까?

계산된 속성은 항상 고정된 이름을 가지며 매개변수를 받지 않습니다. 서브스크립트는 가변 인덱스를 통해 접근할 수 있어 컬렉션 구조를 흉내 냅니다.

일반적인 오류 및 안티패턴

  • 부작용이 있는 작업을 위한 서브스크립트 사용(예: 전역 변수를 변경).
  • 인덱스 범위를 초과하는 것을 명시적으로 처리하지 않음(crash 대신 안전한 동작).
  • 보이는 이유 없이 서브스크립트와 메서드를 혼동함.

실제 사례

부정적 사례

커스텀 구조체에서 서브스크립트를 사용해 전역 상태를 변경하여 배열의 단순 요소에 접근할 때 예상치 못한 부작용을 발생시킴.

장점:

  • 간결함

단점:

  • 불명확한 부작용
  • 디버깅이 어려움

긍정적 사례

구조체 내부의 비공식 배열과만 작업하기 위해 서브스크립트를 사용하며, 범위 초과 처리를 nil 반환으로 구현함.

장점:

  • 논리적이고 안전함
  • 디버깅이 용이함
  • 코드가 읽기 쉬움

단점:

  • 필요한 경우 명시적인 오류 처리를 추가해야 함