[Swift 3] 문자열과 문자 (String, Characters)
출처
문자열
선언
let someString = "Some string literal value"
빈 문자열 초기화
var emptyString = String()
var anotherEmptyString = ""
if emptyString.isEmpty {
print("empty string")
}
문자열은 값 타입이다.
Swift 의 String 타입은 값 타입니다.
새로운 String 값을 만들면 String 값을 함수나 메소드에 전달될 때
또는 상수나 변수에 할당할 때 복사된다. (copied)
각각의 경우 기존 String 의 새로 복사된 값은 생성되고
새로 복사된 값은 원래 버전이 아니며 전달되거나 할당된다.
컴파일러는 필요한 경우에만 실제 복사가 일어나도록
문자열 사용을 최적화해준다.
값 타입처럼 문자열을 작업할 때 항상 좋은 성능을 가지는 것을 의미한다.
문자로 작업하기 (Working with Characters)
Characters 선언은 String 과 같다.
let character : Character = "!"
for character in "Dog!🐶".characters {
print(character)
}
String 값은 초기화 인자 값처럼
Character 의 배열 값을 전달하여 구성될 수 있다.
let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]
let catString = String(catCharacters)
print(catString)
문자열과 문자 연결하기 (Concatenating Strings and Characters)
let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
welcome += "!"
print(welcome)
character 와의 연결은 append() 로 가능하다.
let exclamationMark: Character = "!"
welcome.append(exclamationMark)
문자열 삽입 (String Interpolation)
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
유니코드
유니코드 스칼라 (Unicode Scalars)
특수문자 ( \\, \n, \r, \t, \", \', 0)
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
문자열 관련 Method
count
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
print("\(unusualMenagerie.characters.count) characters") // 40 characters"
let koala = "🐨"
print ("\(koala.characters.count) characters") // 1 characters
var word = "cafe"
print("the number of characters in \(word) is \(word.characters.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.characters.count)")
// Prints "the number of characters in café is 4"
접근과 수정, indices
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: endIndex) // error
for index in greeting.characters.indices {
print("\(greeting[index]) ")
}
삽입과 제거
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// "hello!"
welcome.insert(contentsOf:" there".characters,
at: welcome.index(before: welcome.endIndex))
// "hello there!"
var welcome = "hello there!"
welcome.remove(at: welcome.index(before: welcome.endIndex)) //"hello there"
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range) //"hello"
문자열 비교
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")
}
접두사, 접미사 동등 비교
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" ]
var act1SceneCount = 0
for scene in romeoAndJuliet {
if scene.hasPrefix("Act 1 ") {
act1SceneCount += 1
}
}
print("There are \(act1SceneCount) scenes in Act 1") // 5
문자열의 유니코드 표현
let dogString = "Dog‼🐶"
for utf8unit in dogString.utf8 {
print(utf8unit) //68 111 103 226 128 188 240 159 144 182
}
for utf16unit in dogString.utf16 {
print(utf16unit) //68 111 103 8252 55357 56374
}
for scalar in dogString.unicodeScalars {
print(scalar.value) //68 111 103 8252 128054
}