티스토리 뷰
스위프트의 String은 값 타입입니다.
새로운 String 값을 생성하면 값이 함수 또는 메서드로 전달되거나 상수 또는 변수에 할당될 때 복사됩니다.
각각의 경우 기존의 값이 아닌 새로운 스트링 값이 생성돼서 전달됩니다.
스위프트 컴파일러는 실제로 필요한 경우에만 값을 복사해서 퍼포먼스를 높여줍니다.
String 요소에 접근하기
스트링은 사람이 읽을 수 있는 확장된 문자소 무리의 컬렉션 입니다. 여러 유니코드 스칼라 값으로 "é", "김", "🇮🇳" 같은 여러 문자는 유니코드 스칼라 값으로 구성될 수 있습니다. 이 스칼라 값은 유니코드 바운더리 알고리즘에 의해 결합됩니다.
문자열의 각 요소들은 Character 인스턴스로 표시됩니다.
예를 들어 긴 문자열에서 첫 번째 단어를 찾기 위해 공백을 찾고 그 지점까지 스트링의 접두어를 substring으로 만들 수 있습니다.
let name = "Marie Curie"
let firstSpace = name.firstIndex(of: " ") ?? name.endIndex
let firstName = name[..<firstSpace]
// firstName == "Marie"
firstName 상수는 Substring타입의 인스턴스입니다.
Substring 타입은 원본 스트링의 저장소를 공유하는 스트링의 하위 문자열을 나타냅니다.
Substring은 String과 동일한 인터페이스를 제공합니다.
String의 길이
ASCII 문자인 대문자 A의 경우 4가지 관점에서 같은 길이를 갖습니다.
let capitalA = "A"
print(capitalA.count)
// Prints "1"
print(capitalA.unicodeScalars.count)
// Prints "1"
print(capitalA.utf16.count)
// Prints "1"
print(capitalA.utf8.count)
// Prints "1"
반면에 이모지 플래그 문자의 경우 "\u{1F1F5}"and "\u{1F1F7}" 처럼 Unicode 스칼라 값의 쌍으로 이루어져 있습니다.
이것은 UTF-16이나 UTF-8 하나에 들어가기엔 너무 큽니다.
let flag = "🇵🇷"
print(flag.count)
// Prints "1"
print(flag.unicodeScalars.count)
// Prints "2"
print(flag.utf16.count)
// Prints "4"
print(flag.utf8.count)
// Prints "8"
String Cheat sheet
반복되는 글자만들기
Character 와 String (타입추론 사용하면 String이 됩니다.)
let a = String(repeating: "a", count: 10)
print(a)
let b = "b" as Character
let c = "c"
print(type(of: b)) // Character
print(type(of: c)) // String
글자 확인하기
let smiley = "😀" as Character
print(smiley.isSymbol) // true
print(smiley.isLetter) // false
문자열 인덱스
첫 번째 인덱스는 0입니다.
hello의 마지막 인덱스는 5입니다.
h e l l o " "
0 1 2 3 4 5
let hello = "hello"
let startIndex = hello.startIndex // 0
let endIndex = hello.endIndex // 5
print(hello[startIndex]) // "h"
print(hello[hello.index(after: startIndex)]) // "e"
print(hello[hello.index(before: endIndex)]) // "o"
print(hello[hello.index(startIndex, offsetBy: 4)]) // "o"
print(hello[hello.index(endIndex, offsetBy: -5)]) // "h"
첫 문자 인덱스
let word1 = "ABCDECDE"
if let indexC = word1.firstIndex(of: "C") {
let distance = word1.distance(from: word1.startIndex, to: indexC)
print(distance) // 2
}
String에 포함된 문자, 문자열 찾기
문자열을 찾기 위해서는 import Foundation을 해줘야합니다.
let abc = "abcdeabcd"
print(abc.contains("d")) // true
print(abc.contains("cd")) // true (import Foundation)
문자열 범위
let url = "tistory.com"
if let dotIndex = url.firstIndex(of: ".") {
let tistory = url[url.startIndex..<dotIndex]
print(tistory) // tistory
}
참고
'Swift' 카테고리의 다른 글
[Swift] Property Wrapper 공식문서 번역 (0) | 2021.09.17 |
---|---|
[Swift] weak self를 사용할 때 guard let self vs self? - 일부 번역 (0) | 2021.08.24 |
[RxSwift] withLatestFrom, combineLatest 그리고 Zip (0) | 2021.06.18 |
[RxSwift] Driver란? (Realy? Signal?..) (0) | 2021.05.24 |
[Swift] inout 매개 변수, 앰퍼샌드(&) (0) | 2021.05.17 |