-
String은 왜 Int로 Subscript 되지 않을까?Swift 2021. 12. 15. 23:51
안녕하세요.
최근 들어 Swift로 코딩테스트 준비를 하고 있습니다.
애초에 Swift가 코딩테스트에 적합한 언어는 아니라고 생각하지만..
저는 iOS 개발자니깐요.
아무튼, Swift로 문제를 풀다보면 불편한 부분이 많습니다.
Data Structure도 하나하나 만들어줘야 하고 아무튼 많습니다.
오늘은 그 중에서도 가장 저를 당황케 했던 String 처리를 다뤄보겠습니다.
저는 원래는 파이썬을 사용했었기 때문에
let input = readLine()! // String입니다 print(input[0])
이런 식으로 String의 각 문자에 접근을 하려고 했습니다.
그런데 이러한 방식으로 접근하려 하니 String은 Int형으로 subscript가 안된다고 에러를 뱉어냅니다.
이럴 때는 공식 문서를 살펴봐야겠죠.
https://developer.apple.com/documentation/swift/string
흠.. 문자들의 모음이다.. Unicode??
저 유니코드가 수상합니다.
유니코드를 찾아보겠습니다.
위키피디아에서 유니코드의 인코딩 방식 중 하나인 UTF-8을 검색해보겠습니다.
아.. 유니코드의 문자의 크기가 가변적이라고 하네요.
일반적인 프로그래밍 언어에서는 문자는 아스키 문자로 판단해요.
그래서 위키피디아를 캡처한 사진의 마지막 줄 처럼 1바이트라고 생각합니다.
그러나 Swift는 그렇지 않습니다.
코드를 통해 확인해보겠습니다.
다음과 같은 문자열 3개를 만들어보겠습니다.
모두 1개의 문자로 이루어진 String인 것을 확인할 수 있습니다.
그런데 이 값을 unicodeScalar로 표현으로 확인해보면
이렇게 배열의 크기가 다른 것을 확인할 수 있습니다.
utf8이나 utf16으로 표현했을 때도 마찬가지입니다.
이렇듯 한 개의 글자지만 유니코드로 이루어져 있어 사이즈가 모두 다른 것을 확인할 수 있습니다.
이러한 이유로 일반적인 Int로는 Subscript를 사용할 수 없습니다.
그러면 문자열에서 문자참조는 어떻게 하느냐
Index라는 String안에 nested하게 구현되어 있는 구조체를 이용해 할 수 있습니다.
이런 식으로 구현해서 사용할 수 있습니다.
range로 사용하는 것도 물론 가능합니다.
하지만 저는 코딩테스트 풀 때는 Array(String)으로 바꿔서 subscript를 사용한답니다..
그럼 오늘은 여기까지 하겠습니다.
'Swift' 카테고리의 다른 글
Codable (0) 2021.12.28 NSCoder (0) 2021.12.27 escaping closure(탈출 클로저) (0) 2021.12.23 Hashable (0) 2021.12.17 class 와 struct 그리고 enum (4) 2021.12.14