[Swift] 서브스크립트(Subscripts)

안녕하세요~ 차니에요!

 

오늘은 스위프트의 서브스크립트에 대해 알아보겠습니다.

 

1. 서브스크립트란?

서브스크립트란 콜렉션, 리스트, 시퀀스 등 집합의 특정 멤버 엘리먼트에 간단하게 접근할 수 있는 문법입니다.

텍스트로 보면 잘 와닿지 않을 텐데 사실 우리는 은연중에 서브스크립트를 사용하고 있었을 지도 모릅니다.

 

var dic = ["강아지": "🐶", "깨구락지": "🐸","판다": "🐼", "꿀벌": "🐝"]
print(dic["깨구락지"]) // 🐸

딕셔너리 하나를 생성하였습니다. 타입 추론을 통해 [String : String] 형태이겠죠?

딕셔너리에서 value 값을 추출하기 위해 dic[KEY] 형태로 사용하셨을 텐데요.

이게 서브스크립트입니다. 띠용? 자세한 설명은 아래에서 이어서 해볼게요.

 

2. 서브스크립트 기본 문법

subscript(index: Int) -> Int {
    get {
        // 적절한 반환 값
    }
    set(newValue) {
        // 적절한 set 액션
    }
}

서브스크립트는 읽고-쓰기(read-write) 혹은 읽기 전용(read only)으로 사용이 가능합니다.

 

subscript(index: Int) -> Int {
    // 적절한 반환 값
}

읽기 전용 스크립트의 사용 예 입니다.

get을 적어야 할 것 같지만 따로 작성하지 않으면 기본으로 읽기 전용으로 생성됩니다.

물론 명시해도 똑같이 동작합니다.

 

3. 서브스크립트 사용

3-1. 서브 스크립트

struct Animal {
    var name: String?
    var age: Int?
    var profile: String?
    var height = 0.0
    var weight = 0.0
}

class Zoo {
    var animals: [Animal] = [Animal]()
    
    func addAnimal(animal: Animal) {
        self.animals.append(animal)
    }
    
    subscript (name: String) -> Animal? {
        for animal in self.animals {
            if animal.name == name {
                return animal
            }
        }
        
        return nil
    }
}

스크립트 사용 예제를 작성해보았습니다.

Animal 구조체에 동물의 정보가 들어가고 Zoo 클래스에 동물이 추가될 것 입니다.

 

let bear = Animal(name: "곰", age: 12, profile: "🐻", height: 140, weight: 200)
let tiger = Animal(name: "호랑이", age: 8, profile: "🐯", height: 120, weight: 90)
let monkey = Animal(name: "원숭이", age: 20, profile: "🙉", height: 120, weight: 90)

var zoo = Zoo()
zoo.addAnimal(animal: bear)
zoo.addAnimal(animal: tiger)
zoo.addAnimal(animal: monkey)

print(zoo["원숭이"]) // Optional(name: Optional("원숭이"), age: Optional(20), profile: Optional("🙉"), height: 120.0, weight: 90.0)

위 서브스크립트에서 인자로 String(name)을 넘겨주었기 때문에 zoo[NAME]을 입력하면 해당 동물의 데이터를 가져올 것 입니다.

클래스(zoo)에 동물(Animal)이 없을 수도 있으므로 Optional로 처리해주었습니다.

 

이상으로 포스팅 마치겠습니다.