String을 잘라서 원하는 만큼만 표현하고 싶을 때, 어느 위치까지 자를 것인지 index를 이용해서 substring을 만들 수 있습니다.
예를 들어서, "2022-12-31T04:10:30.345784" 를 T 앞까지 잘라서 "2022-12-31"만 표현하고 싶다면 어떻게 할 수 있을까요?
다양한 방법이 있겠지만, 최근에 알게된 방법은 마치 Array의 원소를 가져오듯이 []를 사용해서 substring을 만드는 방법이 이었습니다.
[]안에는 index range를 넣어주면 됩니다.
저는 날짜 형식의 String에서 앞부분 연월일만 빼내고 싶어서 방법을 찾던 중 알게 되었습니다.
let createdDate = "2022-12-31T04:10:30.345784"
let endIndex = createdDate.firstIndex(of: "T")!
let slicedDate = createdDate[..<endIndex]
먼저, T가 있는 부분의 index를 알기 위해서 firstIndex(_:)를 사용해 주었습니다. 그리고 endIndex 변수에 해당 index를 담아주었습니다.
제가 원하는 Substring은 endIndex 보다 하나 앞까지만 잘라야 하므로 range를 표현할 때 "..<"를 사용해서 T의 index는 포함되지 않게 잘리도록 하였습니다. 이렇게 하면 원하는 대로 연월일 부분만 추출된 형태가 나오게 됩니다.
2022-12-31
만약에 T까지 포함하고 싶다면 range에 "..."를 사용하면 됩니다.
let slicedDate = createdDate[...endIndex]
//2022-12-31T
range는 Int가 아니라 String.Index type입니다. 그냥 숫자를 넣으면 컴파일 에러가 발생합니다. 그렇기 때문에 Swift에서 제공하는 String.Int type을 반환하는 function을 잘 이용해서 범위를 지정해주어야 합니다.
Swift에서는 첫번째 인덱스와 마지막 인덱스를 구하는 function이 내장되어 있습니다. 그리고 특정한 index의 문자의 String.Index를 구하는 function도 있습니다. 이런 도구들을 잘 활용해주면 원하는 range를 만들어 낼 수 있습니다.
예를 들어서, 특정 String의 2번 인덱스에 위치한 문자부터 부터 마지막 인덱스 문자까지 자르고 싶다면 아래처럼 해볼 수 있습니다.
마지막 인덱스는 swift에서 제공하는 endIndex()를 사용하면 바로 구할 수 있습니다.
createdDate.endIndex
그렇다면 2번 인덱스에 위치한 문자의 String.Index는 어떻게 구할 수 있을까요? 바로 index(_ i:, offsetBy:)를 사용하면 됩니다.
i 파라미터에는 첫번째 인덱스를 표현해주는 startIndex()를 넣어주고, 2번 인덱스에 있는 문자를 원하므로 offsetBy에 2를 넣어줍니다.
let midIndex = createdDate.index(createdDate.startIndex, offsetBy: 2)
이렇게 하면 createdDate 변수에 담긴 문자열의 2번째 인덱스 값이 나옵니다.
이 둘을 이용해서 아래처럼 slicing을 할 수 있습니다.
createdDate[slicedDate..<createdDate.endIndex]
//index#2 부터 마지막 index까지를 의미
//22-12-31T04:10:30.345784
여기까지 간단하게 알아보았고,
관련된 또 다른 내용을 알게되면 지속적으로 내용을 추가하려고 합니다 :)
감사합니다.
참고자료
'Swfit' 카테고리의 다른 글
Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" 에러 해결 방법 (0) | 2022.12.02 |
---|---|
날짜 사이 일수 구하기 (0) | 2022.12.02 |
NavigationBar 색상 및 타이틀 색상 변경하기 (0) | 2022.11.12 |
URLComponents (0) | 2022.11.11 |
Cannot find AF in scope - Alamofire 관련 에러 (0) | 2022.11.10 |