본문 바로가기
iOS/Swift

[Swift] (알다가도 모를) 문자열의 접근

by Dev.Andy 2023. 4. 25.

문자열에 대한 알고리즘 문제를 Swift로 풀어보면서 Swift에서 문자열의 접근이 되게 까다롭다는 생각이 들었다. Python에서는 문자열도 배열처럼 대괄호를 통한 인덱스 접근이 곧바로 되지만, Swift는 그렇지 않기 때문이다.

따라서 다시 문자열 접근을 하는 상황이 생겼을 때 처음보다 덜 헤매기 위해 이번 포스팅을 쓰게 되었다. 문자열 접근에 대해 복습도 할 겸 이를 정리하고 싶었다.

 

📌 Swift에서 배열과 문자열의 인덱스 접근

인덱스 접근의 차이점

  • 배열에서는 대괄호[]를 사용하여 인덱스 접근이 손쉽게 가능하다.
  • 이에 반해 문자열은 .index를 메서드를 쓰는 것도 모자라서, startIndex/endIndex라는 메서드와 offsetBy라는 매개변수 이름까지 쓰면서 접근해야 한다. 이 뭔…

예시 코드

알고리즘 문제에 대한 코드의 일부를 살펴 보자.

for index in 0..<s.count {
    let i = s.index(s.startIndex, offsetBy: index)
    
    if s[i] == " " {
        result += " "
        flag += 1
        continue
    } else if flag >= 1 {
        result += s[i].uppercased()
        flag = 0
    } else {
        result += s[i].lowercased()
    }
}

[프로그래머스] (Swift) JadenCase 문자열 만들기 - Lv.2

겉으로 보면 s[i]로 간편하게 접근하는 것 같지만,

i를 할당하기 위해 여러 메서드(index, startIndex)와 매개변수 이름(offsetBy)을 사용하고 있다.

 

📌 끝인데 끝이 아닌 endIndex?

endIndex 의미는 끝 인덱스이지만 실제로 끝이 아니다. 문자열의 마지막 문자의 다음 인덱스를 의미한다(!) 이건 또 뭔…

Swift 공식 문서

Use the startIndex property to access the position of the first Character of a String. The endIndex property is the position after the last character in a String. As a result, the endIndex property isn’t a valid argument to a string’s subscript. If a String is empty, startIndex and endIndex are equal.

Strings and Characters | Documentation

번역

startIndex 프로퍼티로는 문자열의 첫 번째 문자의 위치를 접근할 때 사용하세요. endIndex 프로퍼티는 문자열의 마지막 문자의 다음 위치입니다. 따라서, endIndex 프로퍼티는 문자열 서브스크립트의 적절한 인수가 아닙니다. 만약 문자열이 비어있다면, startIndex와 endIndex는 같습니다.

코드

실제로 코드를 쳐 보면 "String index is out of bounds" 에러가 뜬다

let aString = "abc"
let i = aString.endIndex
print(aString[i]) // Fatal error: String index is out of bounds

해결책

따라서 실제 인덱스의 끝의 직전 인덱스를 입력해야 한다. 이를 위해서는 또 index 메서드를 활용해야 하며 before이라는 매개변수 이름을 써야 한다. 뭐야 이게

let aString = "abc"
let i = aString.index(before: aString.endIndex)
print(aString[i]) // c

댓글