-
Swift 5.6 Strings and Characters기술/iOS 2022. 2. 25. 23:14
Strings and Characters
Swift 의
String
과Character
타입은 코드의 텍스트를 처리하는 빠른 유니코드 호환 방법을 제공합니다. 문자열 생성과 취급을 위한 구문은 C 와 유사한 문자열 구문과 같이 가볍고 읽기 쉽습니다. 문자여 연결은 두 문자열 사이에+
연산자와 함께 결합하여 간단하게 연결 가능합니다. 또한 문자엷 ㅗ간이라는 프로세스에서 문자열을 사용하여 상수, 변수, 리터럴 및 표현식을 긴 문자열에 삽입할 수 있습니다.간단한 구문임에도 Swift 의
String
타입은 빠르고, 최신 문자열 구문입니다. 모든 문자열은 인코딩에 독립적인 유니코드 문자로 구성되어 있으며 다양한 유니코드 표현의 문자에 접근할 수 있도록 지원합니다.String Literals
문자열 리터럴은 쌍따옴표 (
"
) 로 둘러쌓인 문자의 연속입니다.Multiline String Literals
여러 줄의 문자열이 필요하면 3개의 쌍따옴표로 둘러쌓이 문자의 연속인 여러줄 문자열 리터럴을 사용합니다.
소스코드에서 여러 줄 문자열 리터럴에 줄바꿈을 포함하면 줄바꿈도 문자열의 값으로 나타납니다. 만약 줄바꿈을 사용하고 싶지 않으면 백슬래시 (
\
) 를 쓰면 됩니다.닫는 따옴표 앞의 공백은 Swift 가 다른 모든 줄의 공백은 무시한다는 것을 말합니다. 그러나 닫는 따옴표 전에 추가로 공백이 들어가면 그 공백은 추가됩니다.
Special Characters in String Literals
문자열 리터럴은 아래와 같은 특수 문자를 포함할 수 있습니다.
\0
\\
\t
\n
\r
\"
\'
\u{n}
로 쓰여진 임의의 유니코드 스칼라 값. 여기서 n 은 1-8 자리의 16진수
Extended String Delimetrs
아무런 영향 없이 문자열에 특수 문자를 포함하고 싶으면 확장된 구분기호 안에 문자열 리터럴을 위치할 수 있습니다.
let inludeQuotationMarks = #"Here ara three more double quotes: """"#
Initializing as Empty String
var emptyString = "" var anotherEmptyString = String()
isEmpty
프로퍼티로 비어있는지 체크할 수 있습니다.if emptyString.isEmpty {}
String Mutability
var
에 할당되면 변경 가능하고let
에 할당되면 변경이 불가합니다.String are Value Types
Swift 의
String
은 값 타입입니다. 새로운 값을 생성한다면String
값은 함수 또는 메서드에 전달될 때 상수 또는 변수에 대입될 때 복사됩니다.Working with Characters
문자열과
for - in
루프로String
의 각Character
값에 접근할 수 있습니다.String
값은 초기화 인자로Character
값의 배열을 전달해 생성할 수 있습니다.Concatenating Strings and Characters
String
값은 더하기 연산자로 새로운String
값을 생성할 수 있습니다.또는 존재하는
String
변수에 덧셈 대입 연산자 (+=
) 로String
값을 연결할 수 있습니다.String
타입의append()
메서드를 이용하여String
변수에Character
값을 추가할 수 있습니다.String interpolation
문자열 삽입은 상수, 변수, 리터럴, 그리고 문자열 리터럴에 값이 포함된 표현식을 혼합해 새로운
String
값을 생성하는 방법입니다.let multiplier = 3 let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)" // message is "3 times 2.5 is 7.5"
! Unicode
유니코드는 인코딩 표기, 그리고 다른 쓰기 시스템에서의 텍스트 프로세싱을 위한 국제 표준입니다. 거의 모든 언어의 문자를 표준화 된 형식으로 표현하고 텍스트 파일 또는 웹 페이지와 같은 외부 소스에서 해당 문자를 읽고 쓸 수 있습니다. Swift 의
String
과Character
타입은 유니코드를 완벽하게 지원합니다.Unicode Scalar Values
Swift 의 기본
String
타입은 유니코드 스칼라 값으로부터 생성됩니다. 유니코드 스칼라 값은LATIN SMALL LETTER A ("a")
의 경우U+0061
또는FRONT-FACING BABY CHICK ("🐥")
의 경우U+1F425
와 같은 문자를 위한 유니크 한 21-bit 숫자 또는 정수입니다.모든 21-bit 에 유니코드 스칼라 값이 한 문자에 할당되는 것은 아닙니다. 어떤 스칼라는 나중에 할당되거나 UTF-16 인코딩에 사용하기 위해 지정되어 있습니다. 문자에 할당된 스칼라 값은 일반적으로 위의 예에서
LATIN SMALL LETTER A
와FRONT-FACING BABY CHICK
같이 이름을 가지고 있습니다.Extended Grapheme Clusters
Swift 의
Character
타입은 모든 인스턴스는 하나의 확장된 문자소 클러스터로 표기됩니다. 하나의 확장된 문자소 클러스터는 결합되었을 때 사람이 읽을 수 있는 하나의 문자인 하나 이상의 유니코드 스칼라입니다.두 경우 모두 문자
é
는 확장된 문자 클러스터를 나타내는 단일 Swift 값으로 표시됩니다. 첫번째의 경우에는 클러스터에는 단일 스칼라가 포함됩니다. 두번째 경우에는 두 스칼라의 클러스터입니다.let eAcute: Character = "\u{E9}" // é let combinedEAcute: Character = "\u{65}\u{301}" // e followed by ́ // eAcute is é, combinedEAcute is é
확장된 문자소 클러스터는 많은 복잡한 스크립트 문자를 하나의
Character
값으로 표기하는 방법입니다. 예를 들어 한글의 한 음절은 단일 시퀀스 또는 분해된 시퀀스로 표기될 수 있습니다. 두 표현은 모두 Swift 에서 단일Character
값으로 표현됩니다.let precomposed: Character = "\u{D55C}" // 한 let decomposed: Character = "\u{1112}\u{1161}\u{11AB}" // ᄒ, ᅡ, ᆫ // precomposed is 한, decomposed is 한
Counting Characters
문자열에서
Character
값의 카운트를 구하려면 문자열에서count
프로퍼티를 사용합니다.Swift 에서
Character
값을 위한 확장자 문자소 클러스터 사용은 문자열의 연결과 수정은 문자열의 문자 카운트에 영향을 주지 않습니다.NOTE
확장된 문자소 클러스터는 여러개의 유니코드 스칼라로 구성할 수 있습니다. 이것은 다른 문자와 같은 문자의 다른 표기법은 저장할 때 메모리 사용량이 다르게 요구할 수 있다는 의미입니다. 이 때문에 Swift 의 문자는 각 각 문자열에서 동일한 양의 메모리를 차지하지 않습니다.Accessing and Modifying a String
메서드와 프로퍼티 또는 서브스크립트 구문으로 문자열에 접근, 수정할 수 있습니다.
String Indices
각
String
값은 문자열에 각Character
의 위치에 해당하는String.Index
인 인덱스 타입을 가지고 있습니다.위에서 언급했듯이 문자마다 저장할 메모리 양이 다를 수 있으므로 특정 위치에 있는
Character
를 확인하려면 해당String
의 시작 또는 끝에서 각 유니코드 스칼라를 반복해야 합니다. 이러한 이유로 Swift 문자열은 정수 값으로 인덱스를 생성할 수 없습니다.String
의 첫번째Character
에 접근하기 위해startIndex
프로퍼티를 사용합니다.endIndex
프로퍼티는String
의 마지막 문자의 다음 위치입니다. 그 결과endIndex
프로퍼티는 문자열 서브스크립트에 유효한 인자가 아닙니다.String
의 메서드index(before:)
와index(after:)
를 사용하여 주어진 인덱스의 전과 후에 접근할 수 잇습니다. 주어진 인덱스에서 먼 인덱스를 접근하려면 이러한 메서드를 여러번 호출하는 대신index(_:OffsetBy:)
메서드를 사용할 수 있습니다.indices
프로퍼티를 사용하여 문자열에 있는 개별 문자의 모든 인덱스에 접근할 수 있습니다.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"
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)
문자열과 부분 문자열의 차이점은 성능 최적화를 위해 부분 문자열이 원래 문자열을 저장하는데 사용된 메모리의 또는 다른 부분 문자열을 저장되는데 사용되는 메모리의 일부를 재사용할 수 있다는 것입니다. 이 성능 최적화는 문자열이나 부분 문자열을 수정할 때까지 메모리 복사에 대한 비용을 지불할 필요가 없음을 의미합니다.
위에서 언급했듯 부분 문자열은 장기 저장에 적합하지 않습니다. 이것은 원래 문자열의 저장소를 재사용하기 때문에 부분 문자열이 사용되는 한 저네 원본 문자열을 메모리에 보관해야 하기 때문입니다.
Comparing Strings
문자 같음, 접두사 같음, 접미사 같음과 같이 텍스트 값을 비교하는 3가지 방법이 있습니다.
String and Character Equality
같음 연산자 (
==
) 와 같지 않음 연산자( ≠ )
로 문자열과 문자가 같은지 확인합니다.2개의
String
값 또는 2개의Character
값은 확장된 문자소 클러스터가 정규적으로 동일한 경우 2개의 값이 같다고 합니다. 확장된 문자소 클러스터는 다른 유니코드 스칼라로 구성되어 있더라도 언어적 의미와 모양이 같으면 정규적으로 같다고 합니다.Prefix and Suffix Equality
문자열이 특정 접두사 또는 접미사를 가지고 있는지 확인하기 위해 문자열의
hasPrefix(*:)
와hasSuffix(*:)
메서드를 호출하면 됩니다. 두 메서드는 하나의String
타입 인자를 받고 부울 값을 반환합니다.Unicode Representations of Strings
유니코드 문자열이 텍스트 파일 또는 다른 저장소에 쓰여질 때 해당 문자열의 유니코드 스칼라는 정의된 유니코드 인코딩 형식 중 하나로 인코딩 됩니다. 각 형식은 코드 유닛으로 알려진 작은 청크로 문자열을 인코딩 합니다. 이것은 UTF-8, UTF-16, UTF-32 인코딩 형식을 포함합니다.
Swift 는 문자열의 유니코드 표현에 접근하는 여러가지 방법을 제공합니다.
for-in
구문으로 문자열을 반복하여 유니코드 확장된 문자소 클러스터인Character
값에 접근할 수 있습니다.또는 세가지 다른 유니코드 호환 표현 중 하나로
String
값에 접근할 수 있습니다.- UTF-8
- UTF-16
- UTF-32 인코딩 형식에 해당하는 21-bit 유니코드 스칼라 값 ( 문자열의
unicodeScalars
프로퍼티로 접근 )
'기술 > iOS' 카테고리의 다른 글
Swift 5.6 Control Flow (0) 2022.02.26 Swift 5.6 Arrays (0) 2022.02.26 Swift 5.6 Basic Operators (0) 2022.02.25 Swift 5.6 The Basics (0) 2022.02.25 yagom 의 iOS Swift 홈페이지 강좌 (0) 2022.02.19