티스토리 뷰
이번 포스트에서는 Swift에서 문자열과 문자에 대해 살펴보도록 하겠습니다.
Swift에서 제공하는 String은 Foundation 프레임워크의 NSString이 bridge된 타입이기 때문에 NSString의 메소드를 String에서 캐스팅 없이 사용 가능합니다.
(NSString은 Objective C에서 사용하는 문자열 타입입니다.)
문자열은 큰 따옴표(“)로 묶어 표현 합니다. 여러줄의 문자열을 사용하고 싶은 경우 큰 따옴표 3개(“””)로 묶어서 사용할 수 있습니다.
여러줄 문자열을 사용하며 줄바꿈을 하고 싶으면 백슬래쉬(\)를 사용합니다.
let quotation = """
나는 나와 연애를 했다. \
너무 슬프지만 어쩔 수 없다. \
"연애를 하고 싶고 좋은 사람을 만나고 싶다." \
"""
여러줄 문자열을 사용할 때는 첫 시작의 """ 다음 줄부터 마지막 """의 직전까지를 문자열로 봅니다. 그래서 아래 두 줄의 표현으로 이루어진 str1과 str2는 같은 값을 갖게 됩니다.
let str1 = "Hello World"
let str2 = """Hello World"""
문자열의 시작과 끝에 각각 빈줄을 넣고 싶다면 한 줄을 띄어서 문자열을 입력하면 됩니다.
let lineBreaks = """
This string starts with a line break.
It also ends with a line break.
"""
들여쓰기도 가능합니다. 들여쓰기 기준은 끝나는 지점의 """의 위치입니다. 아래의 경우에는 닫는 """위치 앞에 있는 문자들은 전부 무시되고 그 이후의 공백은 문자열에 반영됩니다.
문자열 리터럴의 특수 문자
문자열 리터럴은 다음과 같은 특수 문자를 포함할 수 있습니다.
-
\0, \, \t, \n, \r, \”, \’
-
\u{n}, n은 1-8자리 십진수 형태로 구성된 유니코드
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowlege" - Einstein
let dollaSign = "\u{24}" // $, 유니코트 U+0024
let blackHeart = "\u{2665}" // ♥, 유니코드 U+2665
let sparklingHeart = "\u{1F496}" // 💖,유니코드 U+1F496
값 타입 문자열
Swift의 String은 값 타입(value type)입니다. 그래서 String이 다른 함수 혹은 메소드로부터 생성되면 String값이 할당 될 때, 이전 String의 레퍼런스를 할당하는 것이 아니라 값을 복사해서 생성합니다. 반대로 이야기 하면 다른 메소드에서 할당 받은 문자열은 그 문자열을 수정해도 원본 문자열이 변하지 않기 때문에 편하게 사용하셔도 됩니다.
for character in "Dog!🐶" {
print(character)
}
// D
// o
// g
// !
// 🐶
let exclamationMark: Character = "!"
let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]
let catString = String(catCharacters)
print(catString)
// Prints "Cat!🐱"
부분 문자열
문자열에서 부분문자를 얻기 위해 prefix (_:)와 같은 서브스크립트 메소드를 이용할 수 있는데, 그렇게 얻은 부분 문자열은 문자열(String) 인스턴스가 아니라 부분문자열(SubString) 인스턴스 입니다. 만약 부분 문자열을 단기간에 사용하는게 아니라 오랜기간 사용한다면 문자열 인스턴스로 바꿔서 사용하는게 좋습니다.
let greeting = "Hello, World!"
let index = greeting.index(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning : Hello
// SubString인 beginning을 String으로 변환
let newString = String(beginning)
위와 같이 사용해야하는 것이 좋은 이유는 메모리 관리 때문입니다. SubString은 해당 문자를 직접 갖고 있는 것이 아니라 원본 String의 메모리를 참조해 사용합니다.
그래서 SubString을 계속 이용하는 이상은 원본 String이 계속 메모리에 남아 있게 됩니다. 사용하지 않는 문자열까지도 남게 되는 것이죠. 그렇게 때문에 SubString을 오래 사용하고자 한다면 위 예제처럼 String에서 인스턴스로 만들어 사용하고자 하는 문자만 메모리에 올려놓고 사용하는 것이 관리 효율면에서 좋다고 할 수 있습니다.
문자열의 비교
let latinCapitalLetterA: Character = "\u{41}"
let cyrillicCapitalLetterA: Character = "\u{0410}"
if latinCapitalLetterA != cyrillicCapitalLetterA {
print("These two characters are not equivalent.")
}
// Prints "These two characters are not equivalent."
// 접두사, 접미사 비교
let romeoAndJuliet = [
"Act 1 Scene 1: Verona, A public place",
"Act 1 Scene 2: Capulet's mansion",
"Act 1 Scene 3: A room in Capulet's mansion",
"Act 1 Scene 4: A street outside Capulet's mansion",
"Act 1 Scene 5: The Great Hall in Capulet's mansion",
"Act 2 Scene 1: Outside Capulet's mansion",
"Act 2 Scene 2: Capulet's orchard",
"Act 2 Scene 3: Outside Friar Lawrence's cell",
"Act 2 Scene 4: A street in Verona",
"Act 2 Scene 5: Capulet's mansion",
"Act 2 Scene 6: Friar Lawrence's cell"
]
// 문자열 배열에서 접두어 Act 1가 몇개 들어있는지 확인하는 코드
var act1SceneCount = 0
for scene in remeoAndJuliet {
if scene.hasPrefix("Act 1 ") {
act1SceneCount += 1
}
}
print("There are \(act1SceneCount) scenes in Act 1")
// There are 5 scenes in Act 1
// 문자열 배열에서 접미어 Capulet's mansion 과 Friar Lawrences' cell 이 각각 몇개 들어있는지 확인하는 코드
var mansionCount = 0
var cellCount = 0
for scene in remeoAndJuliet {
if scene.hasSuffix("Capulet's mansion") {
mansionCount += 1
} else if scene.hasSuffix("Friar Lawrence's cell") {
cellCount += 1
}
}
print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
// 6 mansion scenes; 2 cell scenes
이번 포스트에서는 Swift의 문자열에 대해 간단하게 살펴보았습니다.
'프로그래밍언어 > Swift' 카테고리의 다른 글
Swift 함수 (0) | 2020.02.23 |
---|---|
Swift 메모리 안정성 (0) | 2020.02.16 |
Swift 제어문 (조건문, 반복문) (0) | 2020.02.14 |
Swift Collection Types (컬렉션 타입) (0) | 2020.02.10 |
Swift의 기본 연산자 (0) | 2020.02.09 |
- Total
- Today
- Yesterday
- SwiftUI
- 아이폰
- XCode
- java
- Swift
- ios
- Elliotable
- android
- CloudComputing
- databinding
- 오토레이아웃
- C++
- 안드로이드
- retrofit
- Notissu
- Rxjava
- 함수형
- 함수형프로그래밍
- Auto Layout
- 코틀린
- 스위프트
- Apple Watch
- 컬렉션
- 애플워치
- Reactive programming
- Kotlin
- 알고리즘
- 상속
- watchos
- apple
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |