iOS/TIL (Today I Learned)

[240321] 문자열을 나누는 고차함수 | TIL

sngsp 2024. 3. 21. 18:58

components(separatedBy:)

let str = "apple,orange,banana"
let fruits = str.components(separatedBy: ",")
print(fruits) // ["apple", "orange", "banana"]

문자열을 지정된 구분자로 나누어 배열로 반환

split(separator:)

let str = "apple,orange,banana"
let fruits = str.split(separator: ",")
print(fruits) // ["apple", "orange", "banana"]

구분자가 포함된 문자열의 부분을 반환

컴포넌츠와 스플릿의 비교

// 보통은 빈 문자열의 경우를 많이 가르는데 가독성을 위해 ,로 표기

let str = "apple,orange,banana,,"
let fruitsSplit = str.split(separator: ",")
let fruitsComponents = str.components(separatedBy: ",")

print(fruitsSplit) // ["apple", "orange", "banana", ""]
print(fruitsComponents) // ["apple", "orange", "banana", "", ""]

split(separator:) 함수는 빈 문자열을 구분자로 가진 경우에도 결과 배열에 빈 문자열을 포함시키지 않음.
components(separatedBy:) 함수는 구분자가 연속으로 나타날 때 빈 문자열도 반환.

대부분 같은 용도로 쓰이겠지만 디테일하게 들어가면 이런 차이가 있으니 주의할 것.

split(maxSplits:omittingEmptySubsequences:)

let str = "apple,orange,banana"
let fruits = str.split(maxSplits: 1, omittingEmptySubsequences: false)
print(fruits) // ["apple", "orange,banana"]

최대 1회 분할하고 빈 하위 시퀀스를 포함하지 않음으로 설정.
따라서 첫 번째 쉼표(,)를 기준으로 문자열이 두 부분으로 나뉨.

문자열을 지정된 최대 분할 수에 따라 나누고, 빈 하위 시퀀스를 제외할지 여부를 결정

range(of:)

let str = "Hello, World!"
if let range = str.range(of: "World") {
    print("Substring found at index: \(str.distance(from: str.startIndex, to: range.lowerBound))") // 7
} else {
    print("Substring not found")
}

문자열 "World"를 찾고 그 위치의 범위를 찾음.
해당 문자열이 존재한다면 그 위치의 범위를 반환하고, 존재하지 않는다면 nil을 반환함.

문자열을 검색하여 일치하는 첫 번째 위치의 범위를 찾아줌.

replacingOccurrences(of:with:)

let str = "apple,orange,banana"
let replacedStr = str.replacingOccurrences(of: ",", with: ";")
print(replacedStr) // "apple;orange;banana"

해당 메서드는 문자열 내의 모든 쉼표(,)를 세미콜론(;)으로 대체.
쉼표가 모두 세미콜론으로 바뀐 새로운 문자열이 반환.

원본 문자열을 변경하지 않고 새로운 문자열을 반환