iOS

[Swift] : subscript로 String에 접근 할 수 없는 이유

SeorinY 2022. 10. 6. 18:16

subscript로 String에 접근 할 수 없는 이유를 알아보기 위해 subscript에 대해 알아보자!

var intArr = [1, 2, 3]
intArr[0]   // 1

위의 예시처럼 intArr[int] 같이 배열에서 Key 값을 사용하여 Value에 접근해 줄 수 있게 해주는 것이 바로 subscript이다!

 

 

이제 swift 에서 String은 subscript[int]로 접근할 수 없는 이유에 대해 알아보자

 

var intArr = [1, 2, 3]
var string = "abc"

intArr[0]  // 1
string[0]  // error!!!!

위처럼 코드를 작성했다면 오류가 발생했을 것이다.

왜일까?  공식문서에서 String 을 봐보자!

문서에 따르면 String은 유니코드로 이루어진 배열이기 때문이다

 

유니코드는 크기가 정해져있지 않기 때문에 Int로 접근할 수 없는 것이다.

무슨 말인지 이해해보자!

 

일반적인 배열일 경우를 살펴보자

var intArr = [100]
print(intArr)      	// [100]
intArr.forEach {
    print($0)           //  100
}

위처럼 배열 전체를 출력해도 100 이 , 각각의 원소를 출력해도 100 이   하나씩 출력 될 것이다

 

또 다른 경우를 살펴보자. 

Stringunicode의 배열이기 때문에 아래처럼 확인해보자.

var string = "a"
print(string.unicodeScalars)      //a
string.unicodeScalars.forEach {
    print($0)                      //a
}

위처럼 배열 전체를 출력해도 a 가 , 각각의 원소를 출력해도 a 가  하나씩 출력 될 것이다.

 

String 의 또 다른 경우를 살펴봐보자

var string = "👨‍👨‍👧‍👧"
print(string.unicodeScalars)
string.unicodeScalars.forEach {
    print($0)
}

 

실행결과

 

이번에는 하나의 문자열을 넣어줬는데도 각각 출력해보니 4개의 문자가 나왔다.

이렇게 하나의 문자값이 4개의 문자값 크기를 가질 수도 있는 것이 String이다.

 

이러한 이유 때문에 subscript 로 쉽게 접근할 수 없는 것이다!

 

 

 

하지만 String에도 index Key 값으로 Value에 접근할 수 있는 방법이 있다.

바로 String.index 를 사용하는 것이다.  사용법을 알아보자!

//일반적인 배열
var 일반적인배열 = [1, 2, 3]
print(일반적인배열[0])


//String 값 접근하기
var testString = "abcdef"
// 원하는Index는 Int값이다.
let 원하는Index = 0
let indexKey = testString.index( testString.startIndex , offsetBy: 원하는Index )
//indexKey 값을 사용하여 string 배열에 접근할 수 있다!
print(string[indexKey])

 

이제 String도 마음대로 접근할 수 있게 되었다