티스토리 뷰

Swift 공식 가이드/Swift 3

Subscripts

찜토끼 2017. 3. 1. 14:45

Apple 제공 Swift 프로그래밍 가이드(3.0.1)의 Subscripts 부분을 공부하며 정리한 글입니다. 개인적인 생각도 조금 들어가있습니다.



들어가며

서브스크립트란? 콜렉션, 리스트, 시퀀스 안의 멤버 요소(member element)에 접근하기 위한 shortcut이다. 예를 들어 배열이름[인덱스] 혹은 딕셔너리이름[키값] 형태로 바로 해당하는 멤버 요소에 접근할 수 있다.

클래스, 구조체, ENUM 에 대해 서브스크립트를 정의할 수 있다. 하나의 타입에 대응하는 서브스크립트를 여러 개 정의할 수도 있고(subscript overload) 인풋 파라미터를 여러 개 받을 수 있도록 정의할 수도 있다.



Subscript Syntax

서브스크립트의 정의 문법은 인스턴스 메서드 정의와 computed 프로퍼티 정의와 유사하다. subscript 키워드를 사용하여 다음과 같이 정의한다. (참고로 서브스크립트의 정의는 그것을 사용할 타입 내부에 되어야 한다)

subscript(index: Int) -> Int {
    get {
        // 적절한 값을 돌려주기
    }
    set(newValue) {
        // 적절한 셋팅을 해주기
        // computed 프로퍼티처럼 newValue는 디폴트 파라미터 이름.
    }
}


subscript(index: Int) -> Int {
    //get 만 있는 서브스크립트의 경우 get 키워드 생략가능
}

서브스크립트를 사용할 때는 해당하는 타입의 인스턴스 이름 옆에 대괄호를 붙이고 그 안에 적절한 값을 넣어주면 된다. (someArray[index] 처럼)

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}

let threeTimesTable = TimesTable(multiplier: 3)
print("3 곱하기 6은 \(threeTimesTable[6])")



Subscript Usage

서브스크립트는 언제 사용하면 좋을까? (1) 일반적으로 콜레션, 리스트, 시퀀스의 멤버 요소에 접근하기 위한 shortcut으로 많이 사용되며 (2) 특정 클래스나 구조체의 기능을 위해 적절한 서브스크립트를 정의할 수도 있다.

 // swift는 Dictionary 타입의 스크립트를 이런 식으로 사용할 수 있게 정의하였다
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2 // 서브스크립트를 통해 바로 value에 접근 & 할당

// <note> Dictionary의 서브스크립트는 옵셔널 타입을 get/set한다
// 항상 key에 해당하는 value가 존재하는 것이 아니기 때문이다

// 이런 연유로 key에 해당하는 value를 삭제할 때는
// nil을 할당하는 방식이 가능(옵셔널 타입 set)

// 위 Dictionary의 경우에는 서브스크립트가 옵셔널 Int를 get/set한다


Subscript Options

서브스크립트 정의 선택사항에 대해 정리

  • 인풋 파라미터 개수를 원하는 만큼

  • 인풋 파라미터 타입은 어느 것이든

  • 리턴 타입은 어느 것이든

  • 인풋 파라미터 가능 : variable parameters, variadic parameters

  • 인풋 파라미터 불가능 : in-out parameter, default값 할당불가

  • 서브스크립트 개수를 원하는 만큼 (서브스크립트 오버로딩)

struct TestStruct {
    
    subscript(x: Int) -> String {
        return "input \(x)"
    }
    
    subscript(x: Int, y: Int) -> String {
        return "input two numbers : \(x), \(y)"
    }
    
    subscript(strig: String) -> String {
        return "input " + strig
    }
}

var testStruct = TestStruct()
print(testStruct[1]) // input 1
print(testStruct[1,2]) // input two numbers : 1, 2
print(testStruct["string"]) // input string



<추가설명> 모호하지 않게 스크립트 오버로딩을 해야한다



'Swift 공식 가이드 > Swift 3' 카테고리의 다른 글

Initialization (1/3)  (0) 2017.03.12
Inheritance  (0) 2017.03.01
Methods  (0) 2017.03.01
Properties  (0) 2017.02.27
Classes and Structures  (0) 2017.02.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함