๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • Dev Blog
iOS/Swift

[Swift] - ๋ฌธ์ž์—ด๊ณผ ๋ฌธ์ž (Strings and Characters)

by ์œ ์ง„์˜ 2023. 12. 3.

์ฐธ๊ณ  ์ž๋ฃŒ

 

๋ฌธ์ž์—ด๊ณผ ๋ฌธ์ž (Strings and Characters) - Swift

์œ„ ์˜ˆ์ œ์—์„œ ์ฒซ๋ฒˆ์งธ 3๊ฐœ์˜ codeUnit ๊ฐ’ (68, 111, 103)์€ ASCII์™€ ๊ฐ™์€ UTF-8 ํ‘œํ˜„์ธ ๋ฌธ์ž D, o, ๊ทธ๋ฆฌ๊ณ  g ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋‹ค์Œ 3๊ฐœ์˜ codeUnit ๊ฐ’ (226, 128, 188)์€ DOUBLE EXCLAMATION MARK ๋ฌธ์ž์˜ 3 ๋ฐ”์ดํŠธ UTF-8 ํ‘œํ˜„์ž…๋‹ˆ

bbiguduk.gitbook.io

 

Swift ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•œ ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฐธ๊ณ  ์ž๋ฃŒ์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ์  ํ˜น์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ์ ๋“ค์„ ์œ„์ฃผ๋กœ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฐธ๊ณ  ์ž๋ฃŒ ์ด์™ธ์—๋„ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๋ถ€ํ•œ ๋ถ€๋ถ„๋„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 


multiLineString

์—ฌ๋Ÿฌ ์ค„์˜ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ํฐ ๋”ฐ์˜ดํ‘œ 3๊ฐœ(“””)๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

print(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."
*/

 


๋นˆ ๋ฌธ์ž์—ด ์ดˆ๊ธฐํ™”

var emtpryString = ""
var anotherEmptyString = String()

 

 

๋ฌธ์ž์—ด ์ˆ˜์ •

ํ•ฉ์„ฑ ํ• ๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

 


๋ฌธ์ž

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์ž ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

let exclamationMark: Character = "!"

 

๋ฌธ์ž ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ๋ฌธ์ž์—ด์˜ ์ดˆ๊ธฐํ™” ๋ฉ”์†Œ๋“œ์— ์ธ์ž๋กœ ๋„ฃ์–ด ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

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

 

๋ฌธ์ž์—ด์˜ ๊ฐœ๋ณ„ ๋ฌธ์ž๋ฅผ for-in loop์„ ์‚ฌ์šฉํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

for character in "Dog!๐Ÿถ" {
    print(character)
}
// D
// o
// g
// !
// ๐Ÿถ

 


๋ฌธ์ž์—ด ์‚ฝ์ž…

๋ฐฑ์Šฌ๋ž˜์‰ฌ ๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•ด ์ƒ์ˆ˜, ๋ณ€์ˆ˜, ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’์„ ๋ฌธ์ž์—ด์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

let mutiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message : "3 times 2.5 is 7.5"

 


์œ ๋‹ˆ์ฝ”๋“œ

"\u{์œ ๋‹ˆ์ฝ”๋“œ}"์˜ ํ˜•ํƒœ๋กœ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  let precomposed: Character = "\u{D55C}"                        // ํ•œ
  let decomposed: Character = "\u{1112}\u{u1161}\u{11AB}"    // ใ…Ž, ใ…,ใ„ด
  // precomposed : ํ•œ, decomposed ํ•œ
  
  let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}" //์ง€์—ญ์‹ฌ๋ณผ U์™€ S์˜ ๊ฒฐํ•ฉ
  // regionalIndicatorForUS : ๐Ÿ‡บ๐Ÿ‡ธ

 


๋ฌธ์ž์—ด์˜ ์ ‘๊ทผ๊ณผ ์ˆ˜์ •

๋ฌธ์ž์—ด์˜ ์ˆ˜์ •๊ณผ ์ ‘๊ทผ์€ ๋ฌธ์ž์—ด ๋ฉ”์†Œ๋“œ ํ˜น์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ(subscript) ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋ฌธ์ž์—ด ์ธ๋ฑ์Šค

Swift์—์„œ๋Š” ๋‹จ์ˆœํžˆ Intํ˜• ์ธ๋ฑ์Šค๋กœ ๋ฌธ์ž์—ด์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด startIndex, endIndex, index(before:), index(after:), index(_:offsetBy:) ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ์ด์šฉํ•ด ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๋ฌธ์ž์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

let greeting = "Guten Tag!"
greeting[2] // ์˜ค๋ฅ˜
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)] // endIndex๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ ์˜๋ฏธํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์—ด ๊ธธ์ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7) // ์ธ๋ฑ์Šค 7๊ณผ ๊ฐ™์€ ์˜๋ฏธ์ด๋‹ค.
greeting[index]
// a

let index = greeting.index(greeting.endIndex, offsetBy: -2) // ๋์—์„œ 2๋ฒˆ์งธ ์ธ๋ฑ์Šค
greeting[index]
//g
 
 
๋ฌธ์ž์—ด์˜ ๊ฐœ๋ณ„ ๋ฌธ์ž๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” indices ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
 
for index in greeting.indices {
    print("\(greeting[index]) ", terminator: "")
// G u t e n  T a g !

 

* indices๋Š” ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํƒ€์ž…์— ์ ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ํŠนํžˆ Set ํƒ€์ž… ๊ฐ™์€ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์—†๋Š”๋ฐ indices์„ ์‚ฌ์šฉํ•˜๋ฉด ์ธ๋ฑ์Šค ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋ฌธ์ž์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ

๋ฌธ์ž์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ์—๋Š” insert(:at:), insert(contentsOf:at:), remove(at:), removeSubrange(:) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome : hello!

welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
// welcome : hello there!
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome : hello there

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome : hello

 

๋ฌธ์ž์—ด ์ชผ๊ฐœ๊ธฐ

components(seperatedBy:) ์œผ๋กœ ์›๋ณธ ๋ฌธ์ž์—ด์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ชผ๊ฐค ์ˆ˜ ์žˆ๋‹ค.

import Foundation

var str =  "Hello Zedd!"
var arr = str.components(separatedBy: " ")

print(arr)
// ["Hello", "Zedd!"]

var str =  "1+2-3*4/5"
var arr =  str.components(separatedBy: ["+","-","*","/"])

print(arr)
//["1", "2", "3", "4", "5"]

 


๋ถ€๋ถ„ ๋ฌธ์ž์—ด

๋ฌธ์ž์—ด์—์„œ ๋ถ€๋ถ„๋ฌธ์ž๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด prefix (_:)์™€ ๊ฐ™์€ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ์–ป์€ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์€ ๋ฌธ์ž์—ด(String) ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ๋ถ€๋ถ„๋ฌธ์ž์—ด(Substring) ์ธ์Šคํ„ด์Šค์ด๋‹ค. ๋งŒ์•ฝ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋‹จ๊ธฐ๊ฐ„์— ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์˜ค๋žœ๊ธฐ๊ฐ„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฌธ์ž์—ด ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

let name = "jinyoo"
print(name.prefix(2))
// ji

print(type(of: name))
// String
print(type(of: name.prefix(2)))
// SubString

// SubString์„ String์œผ๋กœ ๋ณ€ํ™˜
let newName = String(name.prefix(2))

 

์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ด์œ ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋•Œ๋ฌธ์ด๋‹ค. Substring์€ ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ์ง์ ‘ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์›๋ณธ String์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Substring์„ ๊ณ„์† ์ด์šฉํ•˜๋Š” ์ด์ƒ์€ ์›๋ณธ String์ด ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„ ์žˆ๊ฒŒ ๋œ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด๊นŒ์ง€๋„ ๋‚จ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— Substring์„ ์˜ค๋ž˜ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ String์—์„œ ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋†“๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ฆฌ ํšจ์œจ๋ฉด์—์„œ ์ข‹๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ ๋น„๊ต

์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ์˜ ๋น„๊ต๋ฅผ ์œ„ํ•ด hasPrefix(:), hasSuffix(:) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

// ๋ฌธ์ž์—ด ๋ฐฐ์—ด์—์„œ ์ ‘๋‘์–ด Act 1๊ฐ€ ๋ช‡๊ฐœ ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธ
var act1SceneCount = 0
for scene in remeoAndJuliet {
    if scene.hasPrefix("Act 1 ") {
        act1SceneCount += 1
    }
}
print("There are \(act1SceneCount) scenes in Act 1")
// There are 5 scenes in Act 1

// ๋ฌธ์ž์—ด ๋ฐฐ์—ด์—์„œ ์ ‘๋ฏธ์–ด Capulet's mansion ๊ณผ Friar Lawrences' cell ์ด ๊ฐ๊ฐ ๋ช‡๊ฐœ ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธ
var mansionCount = 0
var cellCount = 0
for scene in remeoAndJuliet {
    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")
// 6 mansion scenes; 2 cell scenes

'iOS > Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift] ARC  (1) 2024.05.24
[Swift] Extension  (1) 2024.05.20
[Swift] - ์ฝœ๋ ‰์…˜ ํƒ€์ž… (Collection Types)  (0) 2023.12.03
[Swift] - ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž (Basic Operators)  (0) 2023.12.03
[Swift] ๊ธฐ๋ณธ (The Basics)  (0) 2023.12.03

๋Œ“๊ธ€