Swift 문자열(String)

이재원·2024년 6월 25일
0

Swift

목록 보기
3/13
post-custom-banner

문자열(String)

문자열은 문자의 연속으로, Swift 문자열은 String 타입으로 표현됩니다. String 타입은 Foundation의 NSString 클래스와 연결되어 있습니다. 또한 NSString에 의해 정의된 메서드를 노출시키기 위해 String을 확장합니다. 이로 인해 Foundation을 import하면 캐스팅 없이 String에서 NSString 메서드에 접근할 수 있습니다.

문자 작업(Working with Characters)

문자열과 for - in루프로 String의 각각의 Character 값에 접근할 수 있습니다.

for character in "Dog!" {
	print(character)
}
// D
// o
// g
// !

또는 하나의 문자 문자열 리터럴을 Character 타입을 명시하여 단독의 Character 상수 또는 변수를 생성할 수 있습니다.

let exclamationMark: Character = "!"

String 값은 초기화 인수로 Character 값의 배열을 전달해 생성할 수 있습니다.

let catCharacters: [Character] = ["C", "a", "t", "!"]
let catString = String(catCharacters)
print(catString) // prints "Cat!"

문자열 삽입(String Interpolation)

역슬래시()접두사에 소괄호를 감싸서 상수, 변수, 리터럴, 그리고 문자열 리터럴에 값이 포함된 표현식을 혼합해 새로운 문자열을 생성할 수 있습니다.

let multiplier = 3
let message = "\\(multiplier) times 2.5 is \\(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"

문자열 카운팅(Counting Characters)

문자열에서 Character 값의 카운트를 구하려면 문자열에서 count 프로퍼티를 사용합니다.

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
print("unusualMenagerie has \\(unusualMenagerie.count) characters")
// Prints "unusualMenagerie has 40 characters"

count 프로퍼티로 반환된 문자의 개수는 같은 문자여도 NSString의 length 프로퍼티와 항상 같지는 않습니다. NSString의 길이는 문자열 내에 유니코드 확장된 문자소 클러스터 수가 아니라 문자열 UTF-16 표현 내의 16-bit 코드 단위 수를 기반으로 하기 때문입니다.

문자열 접근과 수정(Accessing and Modifying a String)

문자열 인덱스(String Indices)

각 String 값은 문자열에 각 Character의 위치에 해당하는 String.Index의 인덱스 타입을 갖고 있습니다. Swift 문자열은 정수 값으로 인덱스를 생성할 수 없습니다.

String의 첫번째 Character에 접근하기 위해 startIndex 프로퍼티를 사용합니다. endIndex 프로퍼티는 String에 마지막 문자의 다음 위치입니다. 그 결과 endIndex 프로퍼티는 문자열의 서브 스크립트에 유효한 인수가 아닙니다.

String의 메서드 index(before:)와 index(after:)를 사용하여 주어진 인덱스의 전과 후에 접근할 수 있습니다. 주어진 인덱스에서 먼 인덱스에 접근하려면 이러한 메서드를 여러번 호출하는 대신 index(_ :offsetBy:) 메서드를 사용할 수 있습니다.

let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a

문자열 범위에 벗어나는 인덱스로 접근하거나 Character에 접근하려고 하면 런타임 에러가 발생합니다.

greeting[greeting.endIndex] // Error
greeting.index(after: greeting.endIndex) // Error

indices 프로퍼티를 사용하여 문자열에 있는 개별 문자의 모든 인덱스에 접근합니다.

for index in greeting.indices {
    print("\\(greeting[index]) ", terminator: "")
}
// Prints "G u t e n   T a g ! "

추가로, String 값 외에도 Array, Dictionary, 그리고 Set과 같이 Collection 프로토콜을 준수하는 어떠한 타입에서든 startIndex와 endIndex 프로퍼티와 index(before:), index(after:), 그리고 index(_ :offsetBy:) 메서드를 사용할 수 있습니다.

삽입과 삭제(Inserting and Removing)

문자열에 특정 인덱스에 하나의 문자를 삽입하려면 insert(:at:) 메서드를 사용하고 다른 문자열의 콘텐츠를 특정 인덱스에 삽입하려면 insert(contentsOf:at:) 메서드를 사용합니다.

var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!"

welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!"

문자열에 특정 인덱스에 있는 하나의 문자를 삭제하려면 remove(at:) 메서드를 사용하고 특정 범위의 부분 무자열을 삭제하려면 removeSubrange(_ :) 메서드를 사용합니다.

welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there"

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome now equals "hello"

삽입과 삭제 역시 rangeReplaceableCollection 프로토콜을 준수하는 어떤 타입에서든 소개된 함수들을 사용할 수 있습니다.

부분 문자열(Substrings)

문자열에서 예를 들어 서브 스크립트 또는 prefix(_ :) 와 같은 메서드를 사용하여 부분 문자열을 얻을 때 그 결과는 다른 문자열이 아닌 Substring의 인스턴스 입니다. Swift의 부분 문자열은 문자열과 거의 동일한 메서드를 가지고 있기 때문에 문자열과 동일하게 부분 문자열을 사용할 수 있습니다. 그러나 문자열과 다르게 문자열에 대한 작업을 수행하는 동안 짧은 시간동안만 부분 문자열을 사용합니다. 결과를 저장할 준비가 되었을 때 부분 문자열을 String의 인스턴스로 변환합니다.

let greeting = "Hello, world!"
let index = greeting.firstIndex(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning is "Hello"

// Convert the result to a String for long-term storage.
let newString = String(beginning)

출처
이 글은 swift 공식 문서를 읽고 정리한 내용입니다.
https://bbiguduk.gitbook.io/swift/language-guide-1/strings-and-characters

profile
20학번 새내기^^(였음..)
post-custom-banner

0개의 댓글