개요
Swift와 Objective-C 프로그래밍 언어는 현대적인 기능과 효율적인 문자열 처리를 위한 툴을 제공합니다. 이 중 String
타입의 enumerateSubstrings
메소드는 문자열의 특정 부분을 열거하고, 각각에 대해 사용자가 정의한 클로저를 실행하면서 이를 가능하게 합니다. 이 메소드는 문자열 처리를 위한 Swift의 강력한 기능 중 하나로, 범위 지정부터 세부 옵션 설정까지 유연성을 제공합니다.
enumerateSubstrings 메소드의 역할
개발자들이 문자열의 세분화된 부분을 쉽게 다룰 수 있게 해주는 메소드입니다. 문자열의 범위를 지정하고, String.EnumerationOptions
를 통해 열거 방식을 세밀하게 제어할 수 있습니다. 이 메소드는 Swift에서 문자열 분석의 백본 역할을 하며, 복잡한 문자열 조작 작업을 단순화합니다.
enumerationOptions 사용하기
문자열 열거 시 사용되는 옵션으로, 문자열을 어떻게 분할할지 결정하는 데 중요한 역할을 합니다. 여기에는 다음과 같은 옵션이 포함됩니다:
.byLines: 줄 단위로 문자열을 나눕니다. 각 줄은 줄 바꿈 문자로 구분됩니다.
.byParagraphs: 문단 단위로 문자열을 나눕니다. 문단은 하나 이상의 연속된 줄 바꿈 문자로 구분됩니다.
.byComposedCharacterSequences: 문자열을 인식 가능한 문자 단위로 나눕니다, 예를 들어 조합형 문자 같은 복잡한 문자 시퀀스도 올바르게 처리합니다.
.byWords: 단어 단위로 문자열을 나눕니다. 단어는 공백이나 구두점으로 구분됩니다.
.bySentences: 문장 단위로 문자열을 나눕니다. 문장은 마침표, 느낌표, 물음표 등으로 구분됩니다.
.reverse: 문자열을 역순으로 열거합니다. 이는 다른 옵션과 결합하여 사용할 수 있습니다.
.substringNotRequired: 부분 문자열을 생성하지 않고 열거 작업을 수행할 수 있습니다, 성능이 향상될 수 있습니다.
.localized: 로케일에 따른 규칙을 적용하여 문자열을 나눕니다
Objective-C 버전
NSStringEnumerationByLines: 문자열을 줄 단위로 나눕니다. 각 줄은 줄 바꿈 문자로 구분됩니다.
NSStringEnumerationByParagraphs: 문단 단위로 문자열을 나눕니다. 문단은 하나 이상의 연속된 줄 바꿈 문자에 의해 구분됩니다.
NSStringEnumerationByComposedCharacterSequences: 문자열을 인식 가능한 문자 단위로 나눕니다, 예를 들어 조합형 문자 같은 복잡한 문자 시퀀스도 올바르게 처리합니다.
NSStringEnumerationByWords: 문자열을 단어 단위로 나눕니다. 단어는 공백이나 구두점으로 구분됩니다.
NSStringEnumerationBySentences: 문자열을 문장 단위로 나눕니다. 문장은 마침표, 느낌표, 물음표 등으로 구분됩니다.
NSStringEnumerationReverse: 문자열을 역순으로 열거합니다. 이는 다른 옵션과 결합하여 사용할 수 있습니다.
NSStringEnumerationSubstringNotRequired: 부분 문자열을 만들지 않고 열거 작업을 수행할 수 있습니다, 이로 인해 성능이 향상될 수 있습니다.
NSStringEnumerationLocalized: 로케일에 따른 규칙을 적용하여 문자열을 나눕니다.
enumerateSubstrings 활용 예시
각 언어에서 사용하는 간단한 예를 들어보겠습니다
let string = """
1. Hellow Swift's example.
2. Hi, Swift
"""
let range = string.startIndex..<string.endIndex
string.enumerateSubstrings(in: range, options: .localized) { substring, substringRange, enclosingRange, stop in
if let substring = substring {
print("result : \(substring)")
}
}
NSString *string = @"1. Hellow Swift's example.\n2. Hi, Swift";
NSRange range = NSMakeRange(0, [string length]);
[string enumerateSubstringsInRange:range options:NSStringEnumerationByWords usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
NSLog(@"Found substring: %@", substring);
}];
이 코드는 문자열 안에서 단어를 열거하고, 발견된 각 단어를 출력합니다. Swift의 클로저는 코드 블록을 간결하고 읽기 쉬운 형태로 만들어 줍니다. 아래는 각 옵션별 항목의 출력 결과물 입니다. 작성된 텍스트에 따라 다르게 출력 될 수 있다는 점 참고 해주시기 바라며, Swift Playground를 통하여 출력을 진행 했습니다.
//.byLines
result : 1. Hellow Swift's example.
result : 2. Hi, Swift
// .byParagraphs
result : 1. Hellow Swift's example.
result : 2. Hi, Swift
// .byComposedCharacterSequences
result : 1
result : .
result :
result : H
result : e
result : l
result : l
result : o
result : w
result :
result : S
result : w
result : i
result : f
result : t
result : '
result : s
result :
result : e
result : x
result : a
result : m
result : p
result : l
result : e
result : .
result :
result : 2
result : .
result :
result : H
result : i
result : ,
result :
result : S
result : w
result : i
result : f
result : t
// .byWords
result : 1
result : Hellow
result : Swift's
result : example
result : 2
result : Hi
result : Swift
// .bySentences
result : 1.
result : Hellow Swift's example.
result : 2.
result : Hi, Swift
// .reverse
result : 2. Hi, Swift
result : 1. Hellow Swift's example.
// .localized
해당 옵션은 언어 규칙에 따라 문자열을 분할하고자 할 때 유용합니다. 이 옵션을 사용하면, 예를 들어, 단어의 경계를 찾거나 문장을 나눌 때 다양한 언어의 특정 규칙을 적용할 수 있습니다.
예를 들어, 영어와 터키어에서는 같은 문자가 다르게 취급될 수 있으며, .localized 옵션은 이러한 차이를 인식하고 적절하게 문자열을 분할합니다.
// .substringNotRequired
문자열의 실제 내용이 필요하지 않을 때 성능을 최적화하기 위해 부분 문자열 생성을 생략하는 데 사용됩니다. 대신에 범위만 가지고 작업을 수행하여, 단어가 존재한다는 사실을 판단할 때 사용 되기도 합니다.
결론
iOS 문자열의 enumerateSubstrings
메소드는 문자열 처리를 위한 강력하면서도 유연한 도구입니다. String.enumerationOptions
와 함께 사용하면, 문자열을 다양한 방식으로 쉽게 쪼개고 각 부분에 대한 작업을 정교하게 수행할 수 있습니다. iOS 개발자에게는 이 메소드가 문자열 처리의 중심적인 역할을 하며, 앱 개발에 있어서 빼놓을 수 없는 핵심 기능입니다.