Notice
Recent Posts
Recent Comments
Link
«   2025/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
Archives
Today
Total
관리 메뉴

욤찌의 개발 일기

[Swift] 내가 알던 Subscripts가 아녀 본문

Swift

[Swift] 내가 알던 Subscripts가 아녀

yyomzzi 2023. 11. 4. 21:49

않이 서브스크립트 뭐여 .. 

그냥 컬렉션에서만 쓰이는 줄 알았는데 ,,, 생각보다 하는 일이 많은 아이였네 ,,,

몰라봐서 미안허다 ,,,


💡Subscripts에 대해 설명하시오.

 

1) 내가 알던 Subscripts

Accesses the contiguous subrange of the collection’s elements specified by a range expression.

 

내가 아는 Subscripts는 이것밖에 없었다 ,,,

컬렉션이나 시퀀스 내부의 특정 범위 요소에 접근할 수 있게 해주는 친구

let myArray = ["안녕", "나는", "배열이야", "만나서", "반가왕"]

let str = myArray[2]
print(str)

// Prints "배열이야"

 

[대괄호] 로 배열이나 딕셔너리에서 내부에 속한 친구들에게 접근할 수 있게 해주는 고마운 친구 !!!!!

인줄로만 알았다

그런데

 

2) 이제 알게된 Subscripts

Classes, structures, and enumerations can define subscripts , which are shortcuts for accessing the member elements of a collection, list, or sequence. You use subscripts to set and retrieve values by index without needing separate methods for setting and retrieval.

 

뭐여 뭐야 뭐여 

클래스, 구조체, 열거형에는 서브스크립트를 정의해서 사용할 수 있다 (???)

뭐지 왜 나만 이제 알았나 ???? 🫠

째뜬 알고보니 좀 기능이 많은 아이였움 대박적 .. !!!! 

 

컬렉션에서 요소들에 접근하기 위해서 별도의 메서드 없이

[대괄호]를 가지고 index값으로 요소를 설정하거나 조회하기 위해 서브스크립트를 사용함.

[대괄호] 자체가 특이한 메서드라고 생각하면 될듯!

 

그래 그러면 정의할 수 있따며 !!!

정의해보자 !!!!

 

3) Subscripts 정의 구문

Subscripts enable you to query instances of a type by writing one or more values in square brackets after the instance name. Their syntax is similar to both instance method syntax and computed property syntax. You write subscript definitions with the subscript keyword, and specify one or more input parameters and a return type, in the same way as instance methods. Unlike instance methods, subscripts can be read-write or read-only.
subscript(index: Int) -> Int {
    get {
        // Return an appropriate subscript value here.
    }
    set(newValue) {
        // Perform a suitable setting action here.
    }
}

 

클래스, 구조체, 열거형 내부에서 subscript 를 정의하고,

인스턴스를 생성해서 인스턴스 이름 뒤에 [대괄호]로 index에 접근하면 되나봄!

그리고 진짜 연산프로퍼티랑 똑같이 생김! 구냥 이름만 다른듯!

그러면 제가 한번 정의해보겠읍니다

 

class Movie {
    var names = ["친절한 금자씨", "헤어질 결심", "아메리칸 셰프", "라따뚜이"]
    
    subscript(index: Int) -> String {
        get {
            return names[index]
        }
        set {
            return names[index] = newValue
        }
    }
}

 

또 나온 Movie 클래스 ㅋㅋㅋㅋㅋㅋㅋ ㅜ 또비 ,,

Movie 클래스 내부에 names 라는 [String] 배열을 생성하고 subscript 구문도 함께 정의해보았다 !!

subscript는 뒤에 꼭 파라미터를 받아서 사용해야 함. 생각해보면 넘나 당연함 ,, 

인덱스 파라미터 안받고 어케 접근한담? 텔레파시 아닌이상 불가.

 

그리고 함수처럼 리턴값을 설정해줘서 어떤 값으로 리턴한다는 것을 명시해줘야함

get only 도 가능하고 getter setter 둘 다 정의 가능! setter 만 정의는 불가

 

그래서 나는 index 값을 넣으면 해당 요소를 get 하고,

newValue를 넣으면 해당 index 번호에 새로운 값을 set 하도록 구현함

(index 파라미터명 바꾸기 가능! set 파라미터명 newValue 말고도 마음대로 바꾸기 가능!)

 

var movie1 = Movie()

그리고 언제나처럼 movie1 변수에 Movie 인스턴스를 생성해서 담아줍니다

그리고 신나게 돌을 던져봅니다

 

 

오~~!~!~! Movie의 names 배열에 접근한 것도 아니고 인스턴스 뒤에 그냥 [대괄호] 붙여서 했더니

서브스크립트 정의한대로 ~~ 프린트가 잘 되는 것을 볼 수가 있음~~ 재밌다 ~~

그럼 get은 잘되니까 이제 set 을 해보자

 

 

오호~~!~! movie1[2] 에 값을 set 했더니 아주주 잘 바뀌는구먼 ~~~

이렇게 subscript를 정의해보고 적용도 해보았슴다

 

그리고 subscript에서 index를 받는 파라미터는 여러개가 될 수도 있고 타입도 꼭 Int가 아니어도 된다고 함!

이것도 어떻게 한번 예제를 만들어 보려고 했는데 넘 어려워서,,^^

공식문서꺼 참고 하께오,,~^^

 

struct Matrix {
    let rows: Int, columns: Int
    var grid: [Double]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        grid = Array(repeating: 0.0, count: rows * columns)
    }
    func indexIsValid(row: Int, column: Int) -> Bool {
        return row >= 0 && row < rows && column >= 0 && column < columns
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValid(row: row, column: column), "Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}

 

이건 행렬 만드는 구조체인것 같은데

째뜬 여기서 보고싶었던 것을 바로 subscript 부분임 !!

subscript(row: Int, column: Int) -> Double

 

이렇게 여러개의 파라미터를 입력받을 수 있다고 하니 

나중에 호옥시 활용할 일이 있을 때 ,, 이것이 기억나면 좋겠다,,^^!

 

 

+) 오 근데 이건 공부하다가 알게된건데 (소들이님 블로그)

생각해보니까 subscript 파라미터명을 index라고 지정해줬는데 우리는 [대괄호] 안에서

movie1[index: 2] ❌

 

이렇게 안쓰고 그냥 

movie1[2] ⭕️

 

이렇게 쓰잖음 ????! 

subscript의 파라미터명은 아규먼트 레이블로 쓰이지 않는다고 함!!!

그냥 파라미터명을 뜻하는거라서 정의할 때 내부에서만 사용하고 굳이 [대괄호] 안에서는 안써줌 !!

와일드카드 패턴으로도 안써줘도 되는거임 ~~!~!

(감사합니다 소들님 ,, 💖)

 

 

4) Type Subscripts (타입 서브스크립트 )

정말 타입 서브스크립트야 말로 진짜 처음 들어보는 개념이었움 

지금까지는 인스턴스에 대한 서브스크립트였다면 

타입 자체에도 서브스크립트를 정의하고 사용할 수 있음!

 

struct Weekday {
    static var weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
    
    static subscript(i: Int) -> String {
        get {
            weekday[i]
        }
    }
}

 

subscript 앞에 타입 메서드, 타입 프로퍼티처럼 static을 붙여주면 됨! 클래스에서는 class를 붙이면 상속도 가능함!

근데 처음에는 weekday 프로퍼티를 그냥 인스턴스 프로퍼티로 선언했더니 

static subscript에서 접근이 안됐음 .. ! 

이것도 타입 스크립트는 타입 프로퍼티에만 가능한가봄!

 

 

이렇게 타입에다가 바로 [대괄호]를 붙여서 접근하니까 값이 잘 나오는걸 볼 수 있습니다~~

 


서브스크립트 아는건줄 알았는데 잘 몰랐던거였음 ,, 오 !

친해지자 서브스크립트!

 

근데 서브스크립트가 String에서는 적용이 안된다는데

내일은 이걸 공부해봐야겠음 !!!!!! 

화이팅 !!!!!!!

 

 

 

📖 reference(늘 감사합니당) ♥️

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/subscripts/

 

Documentation

 

docs.swift.org

https://developer.apple.com/documentation/foundation/data/3017410-subscript

 

subscript(_:) | Apple Developer Documentation

Accesses the contiguous subrange of the collection’s elements specified by a range expression.

developer.apple.com

 

https://babbab2.tistory.com/123

 

Swift) 서브스크립트(Subscript) 정복하기

안녕하세요!?! 소들입니다!!!!!!!!! :D 오늘은 서브스크립트(Subscript)에 대해 알아볼 거예요!!! 이렇게 하나하나 Swift를 정복하다보면.. 언젠가 Swift 왕이 되어 있기를 간절히 바라며.....👑 이번에도

babbab2.tistory.com

https://green1229.tistory.com/286

 

Subscript에 대해 알아보기 (feat.String)

안녕하세요. 그린입니다🍏 오늘 포스팅은 Subscript에 대해 알아보며 Swift 언어에서만 왜 String을 다룰때 Subscript가 어떻게 다른지 알아보겠습니다🙌 우선 Subscript라는것 많이 들어보셨을것 같아요

green1229.tistory.com