단어를 찾기전에 잠시 인덱스에 대해 이야기를 해보자

 

스위프트의 문자열 내부는 인덱스로 찾는다

아래 10글자의 문자열이 담긴 text변수는

let text = "가나다라마바사아자차"

기본적으로 startIndex와 endIndex라는 속성을 가지고있다.

 

그래서 내부 인덱스를 검색해서 문자열 안에서 문자열을 빼내려면 인덱스범위를 포함하고있는

Range라는 녀석을 만들어서 배열에서 인덱스로 뽑아내듯 문자열 옆에 붙여주면 뽑아진다.

 

그래서 아래와 같이 처음과 끝을 지정해서 뽑아주면 처음 문자열과 같은 내용이 출력된다.

 

 

조금 특이한게 끝의 인덱스를 포함을 안시켜야 나온다.

 

이제 다시 원래 하려던 문자열 내부의 단어를 찾아라라는 주제로 돌아오면

 

문자열 내부에 어떠한 단어가 있는지만을 판단하기에는 매우 좋은 함수가있다

String 클래스에는 contains()라는 함수가 있는데

 

이를 이용하면 

let isContains = text.contains("다라")

위 코드는 text에 만약 "다라"가 포함되어있다면 true를 아니라면 false를 반환해준다.

 

단어가 있는지는 검사할 수 있으나 이 방법으론 단어가 어디에 있는지도 찾지 못한다.

위에서 문자열 내부에 값을 뽑아내려면 인덱스로 찾는다고했다.

 

그리고 그 인덱스는 range로 만들어내야 한다. 

 

그리고 String 클래스는 인덱스를 만들어주는 함수중 range() 라는게 있다

 

let range0 = text.range(of: "다라")

 

이렇게 하면 text 내부에 "다라" 라고 적힌 녀석중 가장 처음녀석의 위치(인덱스)를 반환하게 된다.

위치일뿐이지 아직 단어 자체는 없다.

 

이 범위, range는 다양하게 쓸 수 있으나 여기서는 별 의미없이 해당 단어 위치만을 뽑아와 서브로 만들어줄꺼다.

총 세개의 범위에서 뽑아낼건데

 

1. 단어 시작전까지 : w0

2.단어 : w1

3.단어 이후 부터 끝까지 : w2

 

 

해당 소스를 돌리면

 

가나

다라

마바사아자차

 

라고 출력이 된다 

위부터 w0 ~ w2 순이다.

 

위 소스들을 좀 정리하자면 

 

 

guard로 "다라"가 없으면 nil을 있다면 해당 세부분을 String으로 변환해서 반환하는 함수로 만들었다.

참고로 문자열에서 Range를써서 뽑은 값은 SubString으로 String으로 변환해줘야 편하게 쓸 수 있다.

 

 

 

 

그냥 문자열을 쪼개는건 split이 편하다.

 

String.range는 아래와 같이 조건을 줘서

검색범위(range), 검색조건(아래소스는 뒤에서부터 검색), NSLocal.... 어느때 사용하는지를 모르겠다.

let range = text.range(of: "다라", options: .backwards, range: text.startIndex ..< text.endIndex, locale: nil)

 

위 코드처럼 조건을 줘서 위치검색이 가능하다.

 

 

 

+ Recent posts