-
Swift - String IndexProgramming/Swift 2020. 10. 21. 23:32
오늘은 String의 Index에 대해서 같이 공부해보도록 해요 :)
지금까지 Index하면 0부터 시작하는 Int Index가 익숙하실 겁니다.
하지만 Swift에서 String Index는 Int Index가 아닙니다.
한번 확인해 보도록 하겠습니다.
기존에 사용하던 Index를 사용하니 에러가 발생합니다.
String의 Index는 String.Index라는 Nested Type이 따로 존재합니다.
그럼 왜 사용하기 쉬운 Int Index를 사용하지 않고 String.Index를 사용하는 걸까요??
다음 코드를 보면서 설명하도록 할게요.
Hello😀 의 글자 수는 몇 글자인가요?? 이모티콘도 한 글자라고 보면 6글자이죠?
하지만 결과를 보면 NSString으로 선언한 문자열은 7 글자라고 인식합니다.
이처럼 Unicode로 전 세계의 언어들은 경우에 따라 저장하기 위해 다른 바이트가 필요합니다.
이모티콘도 마찬가지겠죠?
저장된 바이트가 다르기때문에 단순하게 Int Index를 사용한다면 잘못된 접근이 발생할 수 있습니다.
NSString에서 😀을 나타내는 Index를 0-based-Index로 한다면 5로 접근해야 하는지 6으로 접근해야 하는지 헷갈리겠죠??
이러한 문제를 방지하기 위해 Swift에서는 String.Index라는 Type의 Index를 사용합니다.
Index의 사용
맨 처음 Index는 0이 아니라 startIndex입니다.
Beepeach의 맨 첫 글자인 B에 접근하려면 str[str.startIndex] 로 접근할 수 있습니다.
그럼 마지막 Index는 endIndex겠죠? 한번 실행해 보겠습니다.
Apple 공식문서에서 다음과 같이 설명합니다.
The array’s “past the end” position—that is, the position one greater than the last valid subscript argument.
endIndex는 맨 마지막 Index가 아니라 맨 마지막의 다음 Index입니다. 그리고 이를 Past the end라고 합니다.
그렇다면 그 전 Index로 가려면 어떻게 해야 할까요??
index(before:) 메서드를 이용하여 전 Index를 구할 수 있습니다.
그럼 다음 Index를 구하는 메서드도 유추해볼 수 있습니다.
index(after:) 메서드를 사용하면 다음 Index를 구할 수 있습니다.
조금 번거롭죠?
만약 5번째 있는 e의 인덱스를 구하고 싶다면 index(after:) 메서드를 4번 사용해서 구해야 할까요?
이럴 때 사용하는 메서드인 index(offsetBy:) 메서드가 있습니다.
처음 Parameter에는 시작점을 전달하고 offsetBy에는 떨어진 길이를 Int로 전달합니다.
이렇게 하면 index(after:)를 여러 번 쓰지 않고 바로 원하는 index를 구할 수 있습니다.
Index Search
Stirng에서 원하는 부분을 검색하여 Index를 알려주는 메서드도 존재합니다.
Beepeach에서 p를 찾고 싶을 때 index(offsetBy:)를 사용해도 되지만 firstIndex(of:) 메서드를 사용해도 됩니다.
파라미터에 원하는 Character를 전달하면 Index를 리턴해줍니다. 하지만 Optional로 리턴해주기 때문에 사용하기 위해선 Unwrapping을 해야겠죠?
Optional Binding을 이용하여 unwrapping을 했습니다.
( Playground에서 guard를 사용하기 위해 else문에 fatalError()를 사용했습니다.)
물론 !를 이용한 Forced unwrapping도 사용 가능하지만 되도록 쓰지 않는 습관을 들이시는 게 좋습니다.
이번에는 peach 부분에 e의 Index를 찾으려 합니다.
여기서 firstIndex(of:) 메서드로 찾은 e가 우리가 원하는 e 였을까요??
firstIndex(of:)는 이름 그대로 처음 존재하는 문자의 Index를 리턴해줍니다.
확인해보기 위해서 우리가 구한 Index를 이용하여 e를 Z로 바꿔보겠습니다.
제일 앞에 있던 e가 바뀐 것을 볼 수 있습니다.
그럼 이 경우에는 어떤 메서드를 사용해야 할까요??
lastIndex(of:)를 사용하면 원하는 e의 Index를 찾을 수 있습니다.
lastIndex(of:)는 이름에서 알 수 있듯이 뒤에서부터 검색을 합니다.
Index 사용 시 주의사항
Index를 이용하여 접근할 때는 항상 조심해야 합니다.
존재하지 않는 Index에 접근한다면 Crash가 발생하기 때문입니다.
Empty String에 startIndex, endIndex를 구하는 것은 error가 발생하지 않습니다.
그리고 Empty String의 startIndex, endIndex는 같은 것을 확인할 수 있습니다.
하지만 이를 통해서 접근을 하려 하면 Crash가 발생하게 됩니다.
기억해 주세요.
Index를 이용한 접근은 항상 조심해서 사용해야 합니다!!
참고자료
https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html
728x90'Programming > Swift' 카테고리의 다른 글
Swift - String Method, Property (Create, Read) (1) 2020.10.27 Swift - SubString (0) 2020.10.22 Swift - Raw String (0) 2020.10.20 Swift - String Format Specifier (0) 2020.10.16 Swift - String - Escape sequence, String Interpolation (0) 2020.10.15