버그 잡이

Swift - 서브스크립트(subscript) 본문

Swift

Swift - 서브스크립트(subscript)

버그잡이 2020. 8. 3. 23:21

 

Subscript란?

 

컬렉션, 리스트, 시퀀스 등 타입의 요소에 접근하는 단축 문법입니다.

예를 들어, var arr = [1,2,3] 이 있습니다.

arr[2]를 통해서 3 이라는 값을 얻을 수 있습니다.

이렇게 [2]와 같은 index 값을 통해 값을 설정하거나 가져올 수 있게 해주는 것이 subscript 입니다.

 

 

구현 방법

 

기본적인 틀은 아래와 같습니다.

subscript(index: Int) -> Int {
    get {
        // get으로 값을 가져올 수 있습니다.
    }
    set(newValue) {
        // set으로 값을 설정할 수 있고
    }
}

 

 

다음과 같이 활용할 수 있습니다.

class FavoriteFoods {
	private var foods = ["bibimbap", "gukbap", "pizza", "steak"]
	subscript(index: Int) -> String {
		get {
			return self.foods[index]
		}
		set {
			self.foods[index] = newValue
		}
	}
}

var favoriteFoods = FavoriteFoods()
print(favoriteFoods[1])  // gukbap
favoriteFoods[2] = "noodle"
print(favoriteFoods[2])  // noodle

 

 

서브스크립트를 활용하여 문자열 다루기

 

서브스크립트를 활용하여 문자열을 배열처럼 다룰 수 있게 만들 수 있습니다.

extension String {
	subscript(_ range: CountableRange<Int>) -> String {
	    let start = index(startIndex, offsetBy: max(0, range.lowerBound))
	    let end = index(startIndex, offsetBy: min(self.count, range.upperBound))
	    return String(self[start..<end])
	}
	
	subscript(_ range: CountablePartialRangeFrom<Int>) -> String {
	    let start = index(startIndex, offsetBy: max(0, range.lowerBound))
	    return String(self[start...])
	}
}

var str = "raykim"
print(str[0..<3])  // ray
print(str[3...]) // kim

 

위 코드를 보면 subscript를 복수로 구현하여 다양한 케이스에 대응할 수 있게 하였습니다.

 

 

 

 

 

타입 서브스크립트

 

위에서 알아본 서브스크립트는 인스턴스에서 사용할 수 있는 서브스크립트입니다.

인스턴스가 아니라 타입 자체에서 사용할 수 있는 서브스크립트도 있습니다.

enum School: Int {
	case elementary = 1, middle, high, university   // middle = 2, high = 3 ... 으로 자동 설정됩니다.

	static subscript(level: Int) -> School? {
		return School(rawValue: level)
	}

}

let school: School? = School[2]
print(school)  // School.middle

 

 

 

*참고

Swift 프로그래밍 3판(저자 : 야곰)

http://minsone.github.io/mac/ios/swift-subscripts-summary

반응형
Comments