나의 발자취

서브스크립트 본문

앱 개발/iOS

서브스크립트

달모드 2022. 6. 26. 03:18

서브스크립트

대괄호를 이용해서 접근가능하도록 만든 문법을 가르킴

 

 - 배열에서 array[인덱스]

 - 딕셔너리에서 dictionary[]

 

 

var array = ["Apple", "Swift", "iOS", "Hello"]

array[0]

array[1]

// 내부적으로 대괄호를 사용하면 어떤 값을 리턴하도록 구현이 되어 있어서 가능한 일

 

 

// 인스턴스.0

// 인스턴스.method()   =====> 이런 형태가 아닌

// 인스턴스[파라미터]     =====> 이런 형태로 동작을 가능하게한 문법 (대괄호로 메서드의 기능을 대신)

 

 

서브스크립트는 특별한 형태의 메서드

1) (인스턴스) 서브스크립트(Subscripts)의 직접 구현 - 클래스, 구조체, (열거형)

  • 메서드기 때문에 인스턴스에 메모리 공간이 할당되어있지 않음
  • 메서드 접근 시 인스턴스 이름으로 접근해야함 ( instance[parameter] )
  • 메서드 실행 시, 스택프레임을 만들고 필요한 데이터를 사용 (그래서 종료 시 사라짐)
  • 파라미터 2개 이상도 구현 가능하긴 함(argument label 따로 사용 안함)
  • get 블록만 선언 시, 읽기 전용 계산 속성 (필수 구현)
  • set 블록은 선택적으로 구현 가능
  • set 블록에서 기본 파라미터 newValue가 제공됨 (파라미터 이름 직접 설정 가능)

 

// 인스턴스 메서드로써의 서브스크립트 구현

 

class SomeData {

    var datas = ["Apple", "Swift", "iOS", "Hello"]

 

    

    subscript(index: Int) -> String {     // 1) 함수와 동일한 형태이지만, 이름은 subscript

        get {                                               // 2) get/set은 계산속성에서의 형태와 비슷

            return datas[index]

        }

        set(parameterName) {

            datas[index] = parameterName         // 또는 파라미터 생략하고 newValue로 대체 가능(계산 속성의 setter와 동일)

        }

    }

    

}

 

 

var data = SomeData()

data[0]                      // get block 실행

data[0] = "AAA"      // set block 실행

 

 

 

// 파라미터 생략 불가(값이 반드시 필요)

// 리턴형도 생략 불가능(저장할 값의 타입 명시 필요)

 

// 읽기 전용(read-only)으로 선언 가능 (set블록은 선택적으로 구현이 가능하고, 쓰기 전용으로의 선언은 불가)

 

 

Int.random(in: 1...10) 을 서브스크립트로 구현도 가능하다.

 

 

 

서브스크립트 사용 예시 - 대괄호[ ] 형태로 사용하는 메서드이다

 

struct TimesTable {

    let multiplier: Int = 3                   // 저장속성

    

    subscript(index: Int) -> Int {       // get 블록만 구현.

        return multiplier * index

    }

}

 

 

let threeTimesTable = TimesTable()    // 인스턴스 생성

 

print("6에 3배를 하면 숫자 \(threeTimesTable[6]) 이(가) 나옵니다.")

 

threeTImesTable[3]

threeTImesTable[5]

threeTImesTable[64]

 

 

또 다른 예시: 2개의 파라미터를 받는 Subscript

struct Matrix {

    // 2차원 배열

    var data = [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]]

    

    // 2개의 파라미터를 받는 읽기전용 서브스크립트의 구현

    subscript(row: Int, column: Int) -> String? {

        if row >= 3 || column >= 3 {

            return nil

        }

        return data[row][column]

    }

}

 

 

// 2개의 파라미터를 받는 서브스크립트 구현도 가능

var mat = Matrix()

 

mat[0, 1]!     // 대괄호 안에 파라미터 2개 필요

 

 

 

 

2) 타입 서브스크립트(Type Subscripts) - 클래스, 구조체, (열거형)

서브스크립트 메서드 앞에 static / class(재정의 가능) 키워드를 사용

 

enum Planet: Int {   // 열거형의 원시값

    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune

    

    static subscript(n: Int) -> Planet {    // 자기 자신을 return하는 경우 Planet 대신 대문자 Self가 들어간다.

        return Planet(rawValue: n)!  // 숫자를 주면 강제로 벗겨서 열거형을 return 한다.

    }

}

 

let mars = Planet[4] 

print(mars)

 

 

 

// static 또는 class 키워드로 타입 자체의 서브스크립트 구현 가능

// class는 상속 시 재정의 가능

 

 

 

 

 

 

 

 

 

'앱 개발 > iOS' 카테고리의 다른 글

클래스의 상속과 초기화(Inheritance, Initialization)  (0) 2022.07.02
접근 제어(Access Control)  (0) 2022.07.01
@unknown 키워드  (0) 2022.06.25
옵셔널  (0) 2022.06.25
열거형과 switch문  (0) 2022.06.03
Comments