티스토리 뷰

1. String and Characters

일반적으로 가장 쉽게 문자열을 생성하는 방법은 문자열 리터럴을 사용하는 것입니다. 문자열 리터럴은 문자열의 길이에 상관 없이 모두 String 문자열 타입을 가집니다.

let s = "String"
let c = "C"

 

 

하나의 문자 타입을 지정하기 위해서는 반드시 타입을 표시해줘야 합니다.

let cc: Character = "C"

// cc 상수는 문자 타입이기 때문에 한 문자만 저장 가능

 

 

문자 타입에 빈 문자를 추가하고 싶은 경우 반드시 공백을 넣어야 하며, 문자열 타입에서는 공백 없이 적어야 빈 문자열을 저장할 수 있습니다.

let emptyChar: Character = " "
let emptyString = ""

// 문자열 생성자로도 빈 문자열 생성 가능
let emptyString2 = String()

 

String Types 은 2가지가 있는데,

1. String => Swift String : 구조체로 구현되어 있으며, 값 형식

2. NSString => Foundation String: 클래스로 구현되어 있는 참조 형식

 

두 타입은 타입 캐스팅 통해 서로 호환해서 사용할 수 있습니다.

var nsstr: NSString = "str"
let swiftStr: String = nsstr as String
nsstr = swiftStr as NSString

 

상수에 저장된 문자열은 변경이 불가하고 변수에 저장된 문자열만 변경이 가능합니다.

let immutableStr = "str"
// immutableStr = "new str"

var mutableStr = "str"
mutableStr = "new str"

 

Swift 는 Unicode 에 독립적인 문자열을 저장합니다.

let str = "Swift String"

str.utf8
str.utf16

var thumbUp = "👍🏻"
thumbUp = "\u{1F600}" // use unicode scala value

//😀
//활짝 웃는 얼굴
//유니코드: U+1F600, UTF-8: F0 9F 98 80

 

2. Multiline String Literals

여러 줄의 문자열을 표현하기 위해서는 """ """ 를 사용합니다. 사용 시 유의 사항은 다음과 같습니다.

 

1. multiline String Literal 은 항상 새로운 라인에서 시작해야 합니다. 즉,  """ 다음 줄에서 문자열을 시작해야 합니다.
2. 마지막 """ 은 단독으로 있어야 하고 첫번째 줄과 같거나 왼쪽에 있어야 합니다. (들여쓰기의 기준이 되기 때문)
3. 줄 마지막에 \ 를 추가하면 줄바꿈이 되지 않습니다.

let loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipooscing elit, sed do eiusmod \n tempor incididunct ut labore et dolore magna aliqua."
print(loremIpsum)

let multiline = """
Lorem ipsum dolor sit amet,
    consectetur adipooscing elit, sed do eiusmod
        tempor incididunct ut labore et dolore magna aliqua.
"""

print(multiline)

// 결과
Lorem ipsum dolor sit amet, consectetur adipooscing elit, sed do eiusmod 
 tempor incididunct ut labore et dolore magna aliqua.
 
Lorem ipsum dolor sit amet,
    consectetur adipooscing elit, sed do eiusmod
        tempor incididunct ut labore et dolore magna aliqua.

 

3. Raw Strings

문자열에서는 ""(문자열의 시작과 끝을 표현) 와 \(escape 시퀀스로 사용) 처럼 특수한 용도로 사용되는 문자들이 있습니다. 이런 문자를 일반 문장열에서 표현하려면 다음과 같이 처리를 해주어야 합니다.

var str = "\"Hello\", Swift 5"

print("=== str ===")
print(str)

// 결과
=== str ===
"Hello", Swift 5

 

 

raw String 은 특수 문자가 포함된 문자열을 쉽게 구성할 수 있습니다. 즉, \ 와 " 를 문자 그대로 처리할 수 있습니다. 이를 사용하면 정규식을 직관적으로 표현하는 것이 가능합니다.

 

사용 방법은 다음과 같습니다.

var rawStr = #"\"Hello\", Swift 5"#
print("=== raw str ===")
print(rawStr)

// 결과
=== raw str ===
\"Hello\", Swift 5
str = "Lorem\nIpsum"
print(str)

// 결과
// Lorem
// Ipsum

rawStr = #"Lorem\nIpsum"#
print(rawStr)

// 결과
Lorem\nIpsum

rawStr = #"Lorem\#nIpsum"#
print(rawStr)

// 결과
Lorem
Ipsum

//양쪽 # 문자의 수를 같게 해야 함. (결과는 위와 같음)
rawStr = ###"Lorem\###nIpsum"###
print(rawStr)
let value = 123
str = "The value is \(value)"
rawStr = #"The value is \#(value)"#

// 정규식을 일반 문자열과 raw string 으로 표현하기
var zipCodeRegex = "^\\d{3}-?\\d{3}$"
let zipCode = "123-456"

if let _ = zipCode.range(of: zipCodeRegex, options: [.regularExpression]) {
    print("valid")
}
zipCodeRegex = #"^\d{3}-?\d{3}$"#

 

4. String Interpolation

문자열 삽입으로 문법은 \(expr) 입니다.

var str = "12.34KB"
let size = 12.34

// 서로 다른 타입의 경우 + 기호로 연결할 수 없음
// str = size + "KB"

str = String(size) + "KB"  // 결과: 12.34KB
str = "\(size)KB"          // 결과: 12.34KB

// 위와 같이 문자 삽입을 하면 원하는 형태로 표현할 수 없음

 

 

원하는 형태로 문자열을 표현하기 위해서는 포맷 지정자(Format Specifier)를 사용합니다. 문법은 %char 입니다.

// .1 은 소수점 한자리까지만
// f 는 실수를 의미함
str = String(format: "%.1fKB", size)  // 결과: 12.3KB

// @: 문자열 대체
String(format: "Hello, %@", "Swift")  // 결과: Hello, Swift

// d: 정수 대체
String(format: "%d", 12)  // 결과: 12

// f: 실수 대체 (소수점 출력 범위 자동 지정)
// 10자리 문자열인데 빈 부분은 0으로 채우고 소수점 3자리까지 표현
String(format: "%010.3f", 12.34)  // 결과: 000012.340

// 자리수를 지정 (양수: 오른쪽 정렬, 음수는 왼쪽 정렬)
String(format: "[%d]", 123)     // 결과: [123]
String(format: "[%10d]", 123)   // 결과: [       123]
String(format: "[%-10d]", 123)  // 결과: [123       ]

let firstName = "Yoon-ah"
let lastName = "Lim"

let korFormat = "그녀의 이름은 %2$@ %1$@ 입니다."
let engFormat = "Her name is %@ %@"

String(format: korFormat, firstName, lastName)  // 결과: 그녀의 이름은 Lim Yoon-ah 입니다.
String(format: engFormat, firstName, lastName)  // 결과: Her name is Yoon-ah Lim

 

 

escape sequence 표현을 알아보면 다음과 같습니다.

str = "\\"
print(str)

// \t: tab
print("A\tB")

// \n: 줄바꿈
print("C\nD")

// \", \'
print("\"Hello\" He said.")

// 결과
\
A	B
C
D
"Hello" He said.

 

문자열 삽입을 사용자가 원하는 형태로 출력하는 방법은 다음과 같습니다.

struct Size {
    var width = 0.0
    var height = 0.0
}

let s = Size(width: 1.2, height: 3.4)
print("\(s)") // 원래 출력: Size(width: 1.2, height: 3.4)

// 1.2 x 3.4 출력로 출력되기를 원하는 경우
extension Size: CustomStringConvertible {
    var description: String {
        return "\(width) x \(height)"
    }
}
print("\(s)") // 변경된 출력: 1.2 x 3.4

Swift 5+ 부터 추가된 String Interpolation 은 다음과 같습니다.

extension String.StringInterpolation {
    mutating func appendInterpolation(_ value: Size) {
        appendInterpolation("\(value.width) x \(value.height)")
    }

    mutating func appendInterpolation(_ value: Size, style: NumberFormatter.Style) {
        let formatter = NumberFormatter()
        formatter.numberStyle = style

        if let width = formatter.string(for: value.width), let height = formatter.string(for: value.height) {
            appendInterpolation("\(width) x \(height)")
        } else {
            appendInterpolation("\(value.width) x \(value.height)")
        }
    }
}

print("\(s)")
print("\(s, style: .spellOut)")

// 결과
1.2 x 3.4
one point two x three point four

 

5. String Indices

문자열은 인덱스 접근이 가능한데 일반적인 정수 인덱스가 아님을 유의해야 합니다.

let str = "Swift"

let firstCh = str[str.startIndex]
print(firstCh)  // 결과: S

// endIndex 는 마지막 문자 다음 인덱스를 의미
let lastCharIndex = str.index(before: str.endIndex)
let lastCh = str[lastCharIndex]
print(lastCh)  // 결과: t

let secondeCharIndex = str.index(after: str.startIndex)
let secondCh = str[secondeCharIndex]
print(secondCh)  // 결과: w

var thirdCharIndex = str.index(str.startIndex, offsetBy: 2)
var thirdCh = str[thirdCharIndex]
print(thirdCh)  // 결과: i

thirdCharIndex = str.index(str.endIndex, offsetBy: -3)
thirdCh = str[thirdCharIndex]
print(thirdCh)  // 결과: i

// 문자열의 index 가 올바른 범위가 아닌 경우 에러가 나기 때문에 확인 후 사용하는 것이 중요!
if thirdCharIndex < str.endIndex && thirdCharIndex >= str.startIndex {
    print("Valid Index")
}

'swift > 문법' 카테고리의 다른 글

13. Swift 문법 - Collections 1 (Array)  (0) 2020.10.20
12. Swift 문법 - Strings and Characters 2  (0) 2020.10.19
10. Swift 문법 - Tuples  (0) 2020.10.17
09. Swift 함수 - Closures  (0) 2020.10.17
08. Swift 문법 - Functions  (0) 2020.10.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함