티스토리 뷰

iOS/Swift-Documents

Swift 5.5 Strings and Characters -3

malrang-malrang 2022. 1. 25. 18:33

빵쟁이가 ios 개발자가 되기위해 정독하고자 작성한 글 입니다!

표현이 이상하거나 잘못번역된 부분이 있을수 있습니다. 

혹 누군가 읽다 잘못된 부분이 있으면 댓글로 알려주세요! 

Strings and Characters (문자열 과 문자)

문자열은 "hello, world" 또는 "albatross"와 같은 문자입니다.

Swift 문자열은 String 유형으로 표현됩니다.

String의 내용은 Character 값의 컬렉션을 포함하여 다양한 방법으로 접근할 수 있습니다.

Character(문자) 의 배열이라고 생각하면 이해하기 쉽다!

 

Swift의 문자열 및 문자 유형은 코드에서 텍스트를 유니코드 호환 방법으로 제공합니다.

C와 비슷한 방법으로 문자열을 생성하고 조작할수있습니다.

문자열 연결은 두 문자열을 + 연산자로 결합하는 것처럼 간단하며 문자열 가변성은 Swift의 다른 값과 마찬가지로 상수 또는 변수에 넣어 활용할수 있다.

문자열 보간을 사용하여 문자열에서 다른 문자열을 불러와 사용 할 수도있다.

 

Swift의 String 유형은 빠르고 현대적인 문자열 입니다. 모든 문자열은 인코딩에 독립적인 유니코드 문자로 구성됩니다.

Note
Swift의 String 유형은 Foundation을 사용하면 NSString 클래스와 연결됩니다. 
Foundation String의 기능을 확장하여 NSString에 의해 정의된 메소드를 사용할수 있게 해줍니다. 
즉 Foundation을 사용하면 캐스팅하지 않고 String에서 해당 NSString 메서드에 접근할 수 있습니다.

// components 같은 것들?을 사용할수있게 해준다.

 

String Literals (문자열 리터럴)

문자로된 코드를 큰 따옴표(") 로 앞뒤에 작성해 문자열 값으로 사용할수있습니다.

상수,혹은 변수에 문자열의 값을 리터럴 형식으로 저장해줍니다.

let someString = "Some string literal value"

Swift는 ("") 리터럴 을 사용하면 문자열로 취급해 someString 상수의 타입이 String 일것이다 하고 타입을 유추합니다.

 

Multiline String Literals (여러줄 리터럴)

문자의 여러 줄을 문자열로 취급하게될경우 세 개의 큰따옴표로 묶어 여러 줄 문자열 리터럴을 사용할수 있습니다.

let quotation = """
The White Rabbit put on his spectacles.  "Where shall I begin,
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""

여러 줄 문자열 리터럴에는 여는 따옴표와 닫는 따옴표 사이의 모든 줄이 포함됩니다.

문자열은 여는 따옴표(""") 뒤의 첫 번째 줄에서 시작하고 닫는 따옴표 앞의 줄에서 끝납니다. 

let singleLineString = "These are the same."
let multilineString = """
These are the same.
"""

여러 줄 문자열 리터럴 내부에서 줄바꿈을 하고싶다면 (\)백슬래시 를 줄바꿈할 줄의 맨마지막에 작성하면 된다.

let softWrappedQuotation = """
The White Rabbit put on his spectacles.  "Where shall I begin, \
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on \
till you come to the end; then stop."
"""

여러줄 리터럴 문자열을 사용할때는 시작줄과 마지막줄을 비어있는 줄로 작성 해주면 좋다.

let lineBreaks = """

This string starts with a line break.
It also ends with a line break.

"""

여러줄 리터럴을 사용할시 들여쓰기? 가 가능하다.

닫는 따옴표 앞에 있는 공백은 들여쓰기 한 것으로 취급되어 공백이 없는값으로 작성되지만 

닫는따옴표 와 겹치거나 뒷부분에 작성된 부분은 공백 문자의값으로 인식된다.

 

예시

Special Characters in String Literals (문자열 리터럴의 특수 문자)

문자열 리터럴에는 다음과 같은 특수 문자가 포함될 수 있습니다.

이스케이프된 특수 문자

\0(널 문자),

\\(백슬래시를 문자열에서 쓰고 싶을 때),

\t(탭 키 한 번 누른 것과 동일한 효과), \n(줄바꿈),

\r(carriage return으로 커서의 위치를 줄의 맨 처음으로 보내는 기능),

\"(문자열에서 큰따옴표 쓰고 싶을 때),

\'(문자열에서 작은따옴표 쓰고 싶을 때)

또한 유니코드를 사용하고 싶으면 \u{n}을 써주면 되고 n에는 1~8자리의 16진수를 써주면 된다.



특수 문자의 네 가지 예시

let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\u{24}"        // $,  Unicode scalar U+0024
let blackHeart = "\u{2665}"      // ♥,  Unicode scalar U+2665
let sparklingHeart = "\u{1F496}" // 💖, Unicode scalar U+1F496

wiseWords 의 예시 처럼 문자열 리터럴 내부에 큰따옴표(")를 포함할 수 있습니다.

여러줄 문자열(""") 에서 사용할 경우에는 그냥 사용할수 있다.

여러 줄 문자열에 """ 텍스트를 포함하려면 따옴표 중 하나 이상을 이스케이프 처리(\)합니다. 

let threeDoubleQuotationMarks = """
Escaping the first quotation mark \"""
Escaping all three quotation marks \"\"\"
"""

result
//Escaping the first quotation mark """
//Escaping all three quotation marks """

 

Extended String Delimiters

확장 구분 기호(#) 안쪽에 문자열 리터럴(")을 배치하여 특수 문자의 효과를 호출하지 않고 문자열에 특수 문자를 포함할 수 있습니다.

문자열을 따옴표(") 안에 넣고 숫자 기호(#)로 묶습니다.

예를 들어, 문자열 리터럴을 인쇄하는 경우 #"Line 1\nLine 2"#은 줄바꿈 하지 않고 줄 바꿈 이스케이프 시퀀스(\n)를 출력 합니다.

문자열 리터럴에서 문자의 특수 효과가 필요한 경우 이스케이프 문자(\) 다음에 오는 문자열 내의 숫자 기호의 동일하게 작성합니다.

예를 들어 문자열이 #"Line 1\nLine 2"#이고 줄 바꿈을 하고 싶다면  #"Line 1\#nLine 2"# 처럼 작성합니다.

마찬가지로 ###"Line1\###nLine2"###도 줄바꿈 합니다.

위의 예시의 결과값은 같습니다!

여러줄 리터럴 에서도 동일하게 사용할수 있습니다.

let threeMoreDoubleQuotationMarks = #"""
Here are three more double quotes: """
"""#

 

Initializing an Empty String (빈 문자열)

빈 문자열 값을 만들려면 변수에 빈 문자열 을 할당하거나 초기화(initializer) 구문을 사용하여 새 문자열 인스턴스를 초기화합니다.

var emptyString = ""               // empty string literal
var anotherEmptyString = String()  // initializer syntax
// these two strings are both empty, and are equivalent to each other

String 값은 isEmpty 라는 프로퍼티를 가지고 있는데 이건 문자열 비어있니? 하고 물어보는것과 같다.

Bool값으로 확인 가능하다. (true, false)

if emptyString.isEmpty {
    print("Nothing to see here")
}
// Prints "Nothing to see here"

 

String Mutability

String을 변수로 선언하면 수정할 수 있고, 상수로 선언하면 수정할 수 없다.

var variableString = "Horse"
variableString += " and carriage"
// variableString is now "Horse and carriage"

let constantString = "Highlander"
constantString += " and another Highlander"
// this reports a compile-time error - a constant string cannot be modified

 

Strings Are Value Types

Swift의 String 타입은 값 타입입니다.

새 문자열 값을 생성하면 해당 문자열 값이 함수나 메서드에 전달되거나 상수나 변수에 할당될 때 복사됩니다.

각각의 경우 기존 String 값의 새 복사본이 만들어지고 원본 버전이 아닌 새 복사본이 전달되거나 할당됩니다.

값타입과 참조타입에 간단한 예시를 들자면

값타입은 원본a4용지를 복사할경우 복사된 a4용지가 새로생기며 복사된 a4용지 에 낙서를하거나 훼손되어도 

원본 a4용지는 아무런 영향이없다! 

변수나 상수에 저장된값을 다른 변수에 할당하고 값을 변경하게되면 처음 그값을 가지고있던 변수나 상수는 값이 변하지 않는다.

 

참조타입은 원본 a4용지가 하나 있고 다른사람에게 이걸 보여주는것...이라고  생각하면 되려나,..

권한을 가진 사람이 a4용지의 값을 변경할수있고 값을 변경하게되면 복사본이고뭐고 없기때문에 그냥 원본값이 변경된다 라는느낌..

class와 struct에 정확히 다 이해하지 못했기 때문에 더이상은 설명이 불가!

 

무튼 값타입이기에 다른곳에 할당하거나 메소드에서 사용될경우 복사본이 여러개 만들어지는데

Swift는 String 최적화를 하여  실제 복사가 꼭 필요한 경우에만 이루어진다고 한다.

 

Working with Characters

for-in 루프를 사용하여 문자열을 반복하여 문자열의 개별 문자 값에 액세스할 수 있습니다.

String(문자열) 은 [Characters] 문자의 배열이라고 생각하면 편하다..!

그렇기 때문에 인덱스 를 가지고있고 0~n 인덱스에 접근할수 있게 된다.

 

사용예시

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

단일 문자 값만을 사용하게될경우 Character 타입으로 선언가능하다!

let exclamationMark: Character = "!"

 Character 값의 배열로 사용한경우!

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

 

Concatenating Strings and Characters

더하기 연산자(+)를 사용하여 문자열 값을 추가(또는 연결)하여 새 문자열 값을 만들 수 있습니다.

let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome now equals "hello there"

추가 할당 연산자(+=)를 사용하여 기존 문자열 변수에 문자열 값을 추가할 수도 있습니다.

var instruction = "look over"
instruction += string2
// instruction now equals "look over there"

String 유형의 append() 메소드를 사용하여 String 변수에 Character 값을 추가할 수 있습니다.

let exclamationMark: Character = "!"
welcome.append(exclamationMark)
// welcome now equals "hello there!"
Note
Character 값에는 단일 문자만 가질수있으므로 
기존 Character 변수에 String 또는 Character를 추가할 수 없습니다.

여러 줄 String을 사용할 때는 마지막 줄에서는 개행이 일어나지 않기 때문에 아래와 같이 해줘야 원하는 대로 문자열을 합칠 수 있다.

let badStart = """
one
two
"""
let end = """
three
"""
print(badStart + end)
// Prints two lines:
// one
// twothree

let goodStart = """
one
two

"""
print(goodStart + end)
// Prints three lines:
// one
// two
// three


 

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"

문자열 리터럴 내부에서 \(multiplier) 을 사용하니 multiplier의 값인 3을 출력해주는것을 알수있다.

그후 Double(multiplier) * 2.5 의 연산 결과도 문자열로 출력되는것을 알수있다.

 여기에서 #을 사용하게될경우 문자열 보간이 사용되는것이 아닌 \() 의 문자가 문자열 값으로 출력되게된다.

print(#"Write an interpolated string in Swift using \(multiplier)."#)
// Prints "Write an interpolated string in Swift using \(multiplier)."

위의 예시처럼 #을 사용한 상황에서 문자열 보간을 사용하고 싶다면

\(백슬래시)뒤에 맨앞에 작성된 #의갯수만큼 똑같이 작성하여 사용하면된다.

print(#"6 times 7 is \#(6 * 7)."#)
// Prints "6 times 7 is 42."

 

Unicode

유니코드는 다양한 쓰기 시스템에서 텍스트를 인코딩, 표현 및 처리하기 위한 국제 표준입니다.

모든 언어의 거의 모든 문자를 표준화된 형식으로 표현할 수 있습니다.

텍스트 파일 또는 웹 페이지와 같은 외부 소스에서 해당 문자를 읽고 쓸 수 있습니다.

이 섹션에 설명된 대로 Swift의 String 및 Character 유형은 유니코드와 호환됩니다.

 

Unicode Scalar Values

Swift의 기본 String 유형은 유니코드 스칼라 값으로 빌드됩니다.

유니코드 스칼라 값은 문자 또는 수정자에 대한 고유한 21비트 숫자입니다.

예를 들어 LATIN SMALL LETTER A("a")의 경우 U+0061, FRONT-FACING BABY CHICK("🐥")의 경우 U+1F425입니다.

문자를 숫자+문자 로표현한 값... 이라고 설명하면될까..

아스키코드랑 비슷한것같다. 비슷한개념이겠죠??

Extended Grapheme Clusters

Swift의 Character 타입은 하나의 grapheme 클러스터를 나타낸다.

확장된 Grapheme Cluster는 유니코드 스칼라 시퀀스로 사람이 읽을 수 있는 문자를 생성한다.

예를 들어é라는 문자가 있다. 이는 유니 코드 스칼라로는é(LATIN SMALL LETTER E WITH ACUTE, orU+00E9) 이렇게 표현된다. 하지만é라는문자를 (LATIN SMALL LETTER E, or U+0065), COMBINING ACUTE ACCENT (U + 0301) 로도 표현할 수 있다. 이렇게 되면 COMBINING ACUTE ACCENT는 앞의 스칼라 즉 U + 0065 에 그래픽으로 적용되어 e를é로 바꿔준다. 즉 e는 단일 스칼라를 포함하고é는 두 개의 스칼라가 포함된 것이다.

 

let eAcute: Character = "\u{E9}"                         // é
let combinedEAcute: Character = "\u{65}\u{301}"          // e followed by ́
// eAcute is é, combinedEAcute is é

Extended grapheme clusters는 많은 복잡한 스크립트 문자를 단일 문자 값으로 표현하는 유연한 방법입니다. 

한글 같은경우 한 을 한 이라고 표현할수도 있고 ㅎ +ㅏ+ ㄴ 으로도 표현 할수있다.

Extended grapheme clusters 를 사용하여 ㅎ + ㅏ + ㄴ 으로 표현된 값을 묶어줄수있다.

let precomposed: Character = "\u{D55C}"                  // 한
let decomposed: Character = "\u{1112}\u{1161}\u{11AB}"   // ᄒ, ᅡ, ᆫ
// precomposed is 한, decomposed is 한

다른예시 2개를 묶어 국기 모양 마크 같은것들을 사용할수있게 해준다.

let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}"
// regionalIndicatorForUS is 🇺🇸

 

Counting Characters

문자열에서 문자 값의 갯수를 검색하려면 문자열의 count 프로퍼티를  사용합니다.

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

아까 위에서  é (\u{E9})이문자는  e , ` \u{65}\u{301} 이렇게 두개의 스칼라로 나눌수있다고 했는데 이런건 몇개의 문자로 

취급하는지 확인해보자.

var word = "cafe"
print("the number of characters in \(word) is \(word.count)")
// Prints "the number of characters in cafe is 4"

word += "\u{301}"    // COMBINING ACUTE ACCENT, U+0301

print("the number of characters in \(word) is \(word.count)")
// Prints "the number of characters in café is 4"

예시들 모두 count 의 값에는 변화가 없다.. 메모리를 쓰는방식이 다른것같다.

아직은 잘모르겠다..

 

Accessing and Modifying a String


메서드 및 프로퍼티를 통해 문자열에 접근하고 수정할수있습니다.

 

String Indices

문자열 String 타입은 Character 타입의 배열이라고 생각할수있다.

그렇기 때문에 String.index 로 해당위치에 있는 Character에 접근할수 있다.

위에서 언급했듯이 Character는 저장하는 데 다른 양의 메모리가 필요할 수 있으므로(유니코드 스칼라 2개를 사용한 값이라던지?)

어떤 Character가 특정 위치에 있는지 확인하려면 해당 문자열의 시작 또는 끝에서 각 유니코드 스칼라를 반복해야 합니다.

이러한 이유로 Swift 문자열은 정수 값으로 index를 생성할 수 없다.

 

startIndex 속성을 사용하면 문자열의 첫 번째 문자 위치에 접근합니다.

endIndex 속성은 문자열에서 마지막 문자 뒤의 (마지막문자+1) 위치입니다. 

그러므로 endIndex 속성은 문자열의 첨자에 대한 유효한 인수가 아닙니다.

String의 값이 비어 있으면 startIndex와 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

문자열 범위 밖의 인덱스 또는 문자열 범위 밖의 인덱스에 있는 문자에 액세스하려고 하면 런타임 오류가 발생합니다.

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

endindex 는 마지막문자의 +1 에 위치하기때문에 위의 예시처럼 사용하게되면 배열의 범위를 초과 했기 때문에 오류가 발생한다!

greeting[greeting.index(before: greeting.endIndex)]
// !

이 예시처럼 index 의 before 메소드 를 사용해서 endIndex 의 전 값 즉 마지막문자의 -1 의 값에 접근하여 사용하여야 한다!

 

indices 속성을 사용하여 문자열에 있는 개별 문자의 모든 인덱스에 접근할수 있습니다.

for index in greeting.indices {
    print("\(greeting[index]) ", terminator: "")
}
// Prints "G u t e n   T a g ! "
Note
Collection 프로토콜을 준수하는 모든 타입에서 startIndex 및 endIndex 속성과 index(before:), 
index(after:) 및 index(_:offsetBy:) 메서드를 사용할 수 있습니다.
문자열과 Array, Dictionary 및 Set과 같은 컬렉션 타입에서 사용가능합니다.

 

Inserting and Removing (값 추가, 값 삭제)

지정된 인덱스의 문자열에 단일 문자를 삽입하려면 insert(_:at:) 메서드를 사용하고 지정된 인덱스에 다른 문자열의 내용을 삽입하려면 insert(contentsOf:at:) 메서드를 사용합니다.

쉽게말해 contentsOf는 값의 update 라고 이해하면 되려나!?

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"
Note
RangeReplaceableCollection 프로토콜을 준수하는 모든 타입에서 insert(_:at:), 
insert(contentsOf:at:), remove(at:) 및 removeSubrange(_:) 메서드를 사용할 수 있습니다.
문자열과 Array, Dictionary 및 Set과 같은 타입이 RangeReplaceableCollection 을 준수하고있습니다.

 

Substrings (부분문자열?)

String에서 prefix(_:)와 같은 메소드로 substring을 가지고 오면 결과는 Substring 인스턴스가 된다.

Swift에서 Substring과 String은 거의 비슷하기 때문에 개발자는 동일하게 사용할 수 있다.

하지만 substring은 String과 다르게 String에 대한 작업을 수행하는 아주 짧은 시간동안만 사용한다.

만약 더 길게 사용하고 싶다면 substring을 아예 새로운 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)

문자열과 마찬가지로 substring도 메모리를 가지게 되는데 string과 substring의 차이는 여기서 발견할 수 있다.

substring은 기존의 String이 사용하고 있는 메모리를 재사용하거나 다른 substring이 사용하는 메모리를 사용할 수 있다.

이는 기존의 String이나 substring을 수정하지 않으면 메모리 복사를 하지 않기 때문에 낭비를 하지 않을 수 있다. 하지만 substring은 기존의 String의 메모리를 재사용하는데 이러한 방식 때문에 substring를 사용하는 동안에는 기존의 String을 메모리에 보관해야 한다. 즉 substring을 오래 지속하기엔 적합하지 않다.

Note
String과 Substring은 모두 StringProtocol 프로토콜을 따르므로 문자열 조작 함수가
StringProtocol 값을 받아들이는 것이 편리한 경우가 많습니다. 
String 또는 Substring 값을 사용하여 이러한 함수를 호출할 수 있습니다.

 

Comparing Strings (문자열 비교)

Swift는 텍스트 값을 비교하는 세 가지 방법을 제공합니다.

  • 문자열과 문자 같음
  • 접두어 같음
  • 접미사 같음

String and Character Equality (문자열과 문자 같음)

같음 연산자(==) 와 같지 않음 연산자(!=)를 사용하여 문자열과 문자가 같은지 확인합니다.

let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    print("These two strings are considered equal")
}
// Prints "These two strings are considered equal"

문자가 표준적으로 동일한 경우 두 개의 문자열 값(또는 두 개의 문자 값)이 동일한 것으로 간주됩니다.

아까 본e +`와 같이 두 개의 스칼라로 이루어 진 문자인 경우에도 é와 동일한 문자로 간주한다.

// "Voulez-vous un café?" using LATIN SMALL LETTER E WITH ACUTE
let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"

// "Voulez-vous un café?" using LATIN SMALL LETTER E and COMBINING ACUTE ACCENT
let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"

if eAcuteQuestion == combinedEAcuteQuestion {
    print("These two strings are considered equal")
}
// Prints "These two strings are considered equal"

반대로 영어에서 사용되는 라틴 대문자 A(U+0041 또는 "A")는 러시아어에서 사용되는 키릴 대문자 A(U+0410 또는 "А")와 동일하지 않습니다.

문자는 시각적으로 유사하지만 동일한 언어적 의미가 없습니다.

문자의 모양은 같지만 사용되는 뜻은 다르기 때문에 다른 문자로 인식 하는것같다.

let latinCapitalLetterA: Character = "\u{41}"

let cyrillicCapitalLetterA: Character = "\u{0410}"

if latinCapitalLetterA != cyrillicCapitalLetterA {
    print("These two characters aren't equivalent.")
}
// Prints "These two characters aren't equivalent."

 

Prefix and Suffix Equality (접두사 , 접미사 같음)

문자열에 특정 문자열 접두사 또는 접미사가 있는지 확인하려면 문자열의 hasPrefix(_:) 및 hasSuffix(_:) 메서드를 호출합니다.

둘 다 String 유형의 단일 인수를 사용하고 Bool 값을 반환합니다.

 

아래 예는 셰익스피어의 로미오와 줄리엣의 에서 Act 의 scene 갯수를 비교하기위한 문자열 입니다.

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"
]

romeoAndJuliet 배열과 함께 hasPrefix(_:) 메서드를 사용하여 Act 1의 장면 갯 수를 계산할 수 있습니다.

var act1SceneCount = 0
for scene in romeoAndJuliet {
    if scene.hasPrefix("Act 1 ") {
        act1SceneCount += 1
    }
}
print("There are \(act1SceneCount) scenes in Act 1")
// Prints "There are 5 scenes in Act 1"

hasSuffix(_:) 메소드를 사용하여 Capulet과 Friar Lawrence이 몇번 사용되는지 갯수를 계산할수 있습니다.

var mansionCount = 0
var cellCount = 0
for scene in romeoAndJuliet {
    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")
// Prints "6 mansion scenes; 2 cell scenes"
Note
hasPrefix(_:) 및 hasSuffix(_:) 메서드는 문자열 및 문자 평등에 설명된 대로 각 문자열의
extended grapheme clusters확장된 자소 클러스터 간에 문자별 표준 동등성 비교를 수행합니다.

 

Unicode Representations of Strings (문자열의 유니코드 표현)

유니코드 문자열이 텍스트 파일이나 다른 저장소에 기록되면 해당 문자열의 유니코드 스칼라는 여러 유니코드 정의 인코딩 형식 중 하나로 인코딩됩니다. 인코딩 형식은 이러한 것들이 있습니다.

  • UTF-8 인코딩 형식(문자열을 8비트 코드 단위로 인코딩)
  • UTF-16 인코딩 형식(문자열을 16비트 코드 단위로 인코딩)
  • UTF-32 인코딩 형식( 32비트 코드 단위의 문자열)

Swift는 문자열의 유니코드 표현에 접근하는 여러 가지 방법을 제공합니다. for-in 문을 사용하여 문자열을 반복할 수 있습니다.

Swift는 문자열의 유니코드 표현을 하는 방법으로 여러 가지를 제공한다.

세 가지의 유니코드 표현 방식으로 String 값에 접근할 수 있다.(UTF-8, UTF-16, UTF-32)

let dogString = "Dog‼🐶"


이러한 코드의 세 가지 유니코드 표현 방식을 살펴보면 다음과 같다.

UTF-8 Representation

개발자는 String의 utf8 프로퍼티로 UTF-8 Representation에 접근할 수 있다.

이는 String.UTF8View로 접근할 수 있고 실제 표현을 보면 아래와 같다.

for codeUnit in dogString.utf8 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// Prints "68 111 103 226 128 188 240 159 144 182 "

3자리 십진수로 문자들을 나타내는 것을 볼 수 있다.

처음의 68, 111, 103은 ASCII 표현과 동일하다. 그다음 226,128, 188은 DOUBLE EXCLAMATION MARK 문자의 3바이트 UTF-8표현이다. 마지막 네 개의 값인 240,159,144,182는 DOG FACE 문자의 4바이트 UTF-8 표현이다.


UTF-16 Representation

개발자는 string.UTF16View로 UTF-16 Representation에 접근할 수 있고 각각의 값은 부호가 없는 16비트(UInt16)로 표현된다.

for codeUnit in dogString.utf16 {
    print("\(codeUnit) ", terminator: "")
}
print("")
// Prints "68 111 103 8252 55357 56374 "

아까와 마찬가지로 68, 111, 103은 UTF-8과 동일하게 표현된다.

느낌표 두 개는 8252로 표현되는데 이는 Unicode scalar U+203C를 10진수로 바꾼 값이다.

마지막 값인 DOG FACE는 UTF-16값으로는 55357, 56374로 표현된다.

 

Unicode Scalar Representation

unicodeScalars 속성을 반복하여 String 값의 유니코드 스칼라 표현에 접근할 수 있습니다.

이 속성은 UnicodeScalar 유형 값의 컬렉션인 UnicodeScalarView 유형입니다.

유니코드를 10진수로 바꿀 수 있다.

for scalar in dogString.unicodeScalars {
    print("\(scalar.value) ", terminator: "")
}
print("")
// Prints "68 111 103 8252 128054 "

반대로 스칼라값으로 문자열을 사용할수 있다!

for scalar in dogString.unicodeScalars {
    print("\(scalar) ")
}
// D
// o
// g
// ‼
// 🐶

 

Swift 공식문서

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

The Basics — The Swift Programming Language (Swift 5.5)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

개발자 pingu 님의 블로그를 참고하여 작성하였습니다!

https://icksw.tistory.com/

 

PinguiOS

iOS 개발자가 되기 위해 iOS 공부, Swift 공부, CS 공부를 하고 있습니다.

icksw.tistory.com

 

'iOS > Swift-Documents' 카테고리의 다른 글

Swift 5.5 Functions -6  (0) 2022.02.04
Swift 5.5 Control Flow -5  (0) 2022.01.27
Swift 5.5 Collection Types -4  (0) 2022.01.27
swift5.5 공식문서 Basic Operators -2  (0) 2022.01.23
swift5.5 공식문서 The Basics -1  (0) 2022.01.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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 31
글 보관함