아스키코드와 유니코드
UTF-8, 16, 32
someString = "\u{유니코드스칼라값}"
var h1 = "\u{D55C}" // "한"
var h2 = "\u{1112}\u{1161}\u{11AB}" // "ㅎ" "ㅏ" "ㄴ"
h1 == h2 // true
h1.count // 1
h2.count // 1
스위프의 문자열은 글자의 의미 단위로 사용하기 때문에, 정수 인덱스 접근이 불가능하다
멀티라인 스트링 리터럴 (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."
"""
\()
CustomStringConvertible : 출력 형태를 직접 구현 (프로토콜)
StringInterpolation : (문자열 구조체 내에 구현된 메서드)
struct Point {
let x: Int
let y: Int
}
let p = Point(x: 5, y: 7)
let q = Dog(name: "초코", weight: 90)
extension String.StringInterpolation {
mutating func appendInterpolation(_ value: Point) {
appendInterpolation("X좌표는 \(value.x), Y좌표는 \(value.y)입니다.")
}
mutating func appendInterpolation(_ value: Dog) {
appendInterpolation("강아지의 이름은 \(value.name), 몸무게는 \(value.weight)입니다.")
}
}
print(p)
print("\(p)")
print(q)
print("\(q)")
출력 형식 지정자 (Format Specifiers)
var string: String = ""
// Double 타입을 문자열로 변환 (정확하게는 타입을 변환하는게 아니고, 생성자를 이용해서 새롭게 생성하는 것)
string = String(3.1415926)
//print(string)
string = "원하는 숫자는 " + String(format: "%.3f", pi) // 반올림
//print(string)
string = "원하는 숫자는 " + String(format: "%.2f", pi)
//print(string)
string = String(format: "원하는 숫자는 %.2f", pi) // %.2f 자리에 pi를 대체
//print(string)
/* Format Specifiers 종류 */
string = String(format: "%d", 7) // %d, %D ===> 정수
print(string)
string = String(format: "%2d", 7) // 두자리로 표현
print(string)
string = String(format: "%02d", 7) // 두자리로 표현하되, 0포함
print(string)
string = String(format: "%07.3f", pi) // 일곱자리로 표현하되 0과 .(dot) 포함, (소수점아래는 3자리)
print(string)
var swift = "Swift"
string = String(format: "Hello, %@", swift) // %@ ===> 문자열
print(string)
/* 활용 */
var firstName = "Gildong"
var lastName = "Hong"
var korean = "사용자의 이름은 %2$@ %1$@ 입니다." // 1$ 첫번째 파라미터, 2$ 두번째 파라미터
var english = "The username is %1$@ %2$@."
string = String(format: korean, firstName, lastName)
print(string)
string = String(format: english, firstName, lastName)
print(string)
NumberFormatter
// 소수점 버리기
let numberFormatter = NumberFormatter()
numberFormatter.roundingMode = .floor // 버림으로 지정
numberFormatter.maximumSignificantDigits = 3 // 최대 표현하길 원하는 자릿수
let value = 3.1415926
var valueFormatted = numberFormatter.string(for: value)! // 문자열화시키는 메서드
print(valueFormatted) // 3.14
// 소수점 필수적 표현하기
numberFormatter.roundingMode = .floor // 버림으로 지정
numberFormatter.minimumSignificantDigits = 4 // 최소 표현하길 원하는 자릿수
let value2 = 3.1
valueFormatted = numberFormatter.string(for: value2)! // 문자열화시키는 메서드
print(valueFormatted) // 3.100
// 세자리수마다 콤마 넣기 ⭐️
numberFormatter.numberStyle = .decimal // 10진수로 표현하는 방식
let price = 10000000
let result = numberFormatter.string(for: price)!
print(result) // "10,000,000"
var greeting = "Hello, World!"
// 타입 : String.index
let index: String.index = greeting.firstIndex(of: ",") ?? greeting.endIndex // nil coalescing
// 타입 : String.SubSequence
// -> 기존 String의 메모리 공간을 공유한다 (새로운 메모리 공간x)
let beginning: String.SubSequence = greeting[..<index>]
var word: String.SubSequence = greeting.prefix(5) // 앞에서 5글자
var word2 = greeting.suffix(3) // 뒤에서 3글자
// 새로운 메모리 공간을 가지는 것이 아니라, 기존 String의 메모리 주소를 가리킨다. (메모리 공간을 공유한다)
/* 그렇다면, 기존 문자열을 내가 수정하면 어떻게 되는가 */
greeting = "Happy"
// 그제서야, 새로운 메모리 공간을 만든다. -> 스위프트 내부에서 알아서 최적화
// word에는 여전히 Hello가 저장되어 있다.