본문 바로가기

스피드 문법정리

11. String and Character

String and Character

스위프트는 만약 double, float, string, character와 같은 타입을 추론할 때 정확한 타입을 명시하지 않는 이상 큰 범위의 타입을 선택, character 타입의 경우 타입 어노테이션 하지 않는다면 문자열로 추론됨

let s = "String"
let c : Character = "C"

character의 경우 빈칸을 띄우면 빈 문자열로 인식되지만 문자열의 경우 길이를 보고 인식하기 때문에 빈 문자열을 만들기 위해서는 공백이 없어야 함

let empthyChar : Character = " "
let empthyString1 = " "
let empthyString2 = ""
empthyString1.count // 1
empthyString2.count // 0

빈 문자열 생성

let empthyString = String()

String Types

값 형식 문자열은 String, 참조형식 문자열은 NSString 타입을 쓰고 서로 호환시키기 위해서는 타입 캐스팅 과정을 거쳐야 함 

Toll - Free Bridged -> 타입 캐스팅으로 호환되는 자료형을 일컫는 말

var nsstr : NSString = "str"

let swiftStr : String = nsstr as String
nsstr = swiftStr as NSString

Mutability

변수와 상수 개념

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

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

Multiline String Literals

Singleline String Literals 에서는 명시적인 줄 바꿈이 되지 않으나 Multiline String Literals에서는 가능

1. Multiline String Literals은 항상 새로운 라인에서 시작해야 함

2. 마지막에 있는 큰 따옴표는 항상 마지막에 한 줄에 단독으로 작성해야 함 

3. 첫 번째 줄과 동일선상이나 왼쪽에 있어야함 -> 첫번째 줄의 시작 위치와 마지막 큰 따옴표의 위치가 문자열 들여 쓰기의 기준이 되기 때문임

4. Multiline String Literals에서 마지막 줄에 백슬래쉬를 붙인다면 줄 바꿈이 되지 않음

let multiline """
Lorem Ipsum is simply dummy text of the printing and typesetting industry. 
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 
when an unknown printer took a galley of type and scrambled it to make a type specimen book. 
"""

String Interpolation

자동으로 값을 문자열로 변화시켜줌, 원하는 포맷을 직접 지정할 수 없음

\(expr)
let size = 12.34
str = String(size) + "KB" // 12.34KB
str = "\(size)KB"

String Indices

마지막 문자열에 접근할 때는 endIndex의 경우 마지막 문자열의 다음 문자를 가리킴 -> Index(before)를 활용

let str = "Swift"

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

let lastCharIndex = str.index(before : str.endIndex)
let lastCh = str[lastCharIndex]
print(lastCh) // t

let secondCharIndex = str.index(after : str.startIndex)
let secondCh = str[secondCharIndex]
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 

String Basics

var str = "Hello, Swift String"
var emptyStr = ""
emptyStr =  String()

let a = String(true) // 문자열 true
let b = String(12) // 문자열 12
let c = String(12.34) // 문자열 12.34
let d = String(str) // 같은 값을 가지는 새로운 문자열 "Hello, Swift String

let hex = String(123, radix : 16) // 123이라는 숫자가 16진수 문자열로 바뀜 7b
let octal = String(123, radix : 8) // 123이라는 숫자가 8진수 문자열로 바뀜 173
let hex = String(123, radix : 2) // 123이라는 숫자가 16진수 문자열로 바뀜 1111011

let repeatStr = String(repeating : "A", count : 7) // AAAAAAA

let e = "\(a) \(b)" // true 12
let f = a + b // true12
str += "!!" // "Hello, Swift String!!"

str.count // 21
str.isEmpty // false

str == "Apple" // false
"apple" != "Apple" // true / 대소문자 구분
"apple" < "Apple" // false / 아스키코드로 크기비교

str.lowercased() // "hello, swift string" / ed, ing로 끝나면 새로운 값을 리턴
str.uppercased() // "HELLO SWIFT STRING"
str // "Hello, Swift String"
str.capitalized // 각 단어의 첫번째문자 대문자로 변환

for char in "Hello" { // "H", "e", "l", "l", "o"
    print(char)
}

let num = "1234567890"
num.randomElement() // 임의의 숫자 리턴
num.shuffled() // 문자열에 속한 문자를 랜덤으로 섞어 문자배열로 리턴

Substring

substring은 원본 문자열의 메모리를 공유

예시에서 first는 str의 H의 원본 문자열을 공유하고 있음, first를 변경하게 되면 그때 새로운 메모리에 복사가 되고 저장됨 -> first를 바꿔도 str은 변경되지 않음

위와 같은 방식을 Copy-on-Write Optimization이라 부름

불필요한 복사와 메모리 생성을 최대한 줄여 서 코드의 실행 성능을 높여줌

let str = "Hello, Swift"
let l = str.lowercased () // "hello, swift"

var first = str.prefix(1) // H
first.insert("!", at : first.endIndex) // H!

str // "Hello, Swift"
first // H!

let newStr = String(str.prefix(1)) // Copy-on-Write Optimization을 하지않고 새로운 메모리에 바로 저장

let s = str[str.strartIndex ..< str.index(str.startIndex, offsetBy : 2)] // He
let t = str[..<str.index(str.startIndex, offsetBy : 2)] // He

str[str.index(str.startIndex, offsetBy : 2)...] // llo, Swift

let lower = str.index(str.startIndex, offsetBy : 2)
let upper = str.index(str.startIndex, offsetBy : 5)
str[lower...upper] // llo

String Editing

Appending String and Characters

대부분의 메서드 뒤에 ing, ed가 붙어있다면 값을 리턴해주는 경우가 많음, 그냥 동사만 있을 경우는 원본을 수정하는 경우가 많음 

// append의 경우 대상 문자열을 직접 변경
var str = "Hello"
str.append(", ") // Hello,
str // Hello,

// appending의 경우 대상 문자열을 변경하지않고 argument로 전달한 문자열을 연결한 다음 새로운 문자열 리턴
let s = str.appending("Swift") // Hello, Swift
str // Hello,
s // Hello, Swift

"File size is ".appendingFormat("%.1f", 12.3456) // File size is 12.3
var str = "Hello Swift"
str.insert(",", at : str.index(str.startIndex, offsetBy : 5)) // "Hello, Swift"

if let sIndex = str.firstIndex(of : "S") {
    str.insert(contentsOf : "Awesome", at : sIndex)
}

str // "Hello,AwesomeSwift"

Replacing Substrings

var str = "Hello, Objective-C"
if let range = str.range(of : "Objective-C") { 
    str.replaceSubrange(range, with : "Swift") // "Hello, Swift"
}
str // "Hello, Swift"

if let range = str.range(of : "Hello") {
    let s = str.replacingCharacters(in : range, with : "Hi")
    
    s // "Hi, Swift"
    str // "Hello, Swift"
}

var s = str.replacingOccurrences(of : "Swift", with : "Awesome Swift")
s // "Hello,Awesome Swift"

s = str.replacingOccurrences(of : "swift", with : "Awesome Swift")
s // "Hello, Swift" / 문자열 비교에서는 대소문자를 구별하기 때문에 원본 문자열을 그대로 리턴

Removing Substrings

var str = "Hello, Awesome Swift!!!"

let lastCharIndex = str.index(before : str.endIndex)
var removed = str.remove(at :lastCharIndex)
removed // !
str // "Hello, Awesome Swift!!"

removed = str.removeFirst()
removed // "H"
str // "ello, Awesome Swift!!"

str.removeFirst(2) // "lo, Awesome Swift!!"
str // "lo, Awesome Swift!!"

str.removeLast() // !
str // "lo, Awesome Swift!"

str.removeLast(2) // "lo, Awesome Swif"
str // "lo, Awesome Swif"

if  let range = str.range(of : "Awesome") {
    str.removeSubrange(range) // "lo, Swif"
    str // "lo, Swif"
}

str.removeAll() // "" / 메모리 공간까지 삭제
str // ""

str.removeAll(keepingCapacity : true) // "" / 메모리 공간은 놔둠

var str = "Hello, Awesome Swift!!!"

var substr = str.dropLast() // "Hello, Awesome Swift!!" // 원본 문자열에서 마지막 문자를 뺀 나머지 메모리 공간 공유
substr - str.dropLast(3) "Hello, Awesome Swift" // 위와 같이 새로운 메모리 공간을 만들지 않고 원본 공유

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'스피드 문법정리' 카테고리의 다른 글

10. Closures  (0) 2020.06.26
20. Protocol  (0) 2020.06.23
18. Initializer and Deinitializer  (0) 2020.06.22
17. Inheritance and Polymorphism  (0) 2020.06.19
16. Method and Subscript  (0) 2020.06.19