문자열 다루기
문자열 <-> 배열
var someString = "Swift"
var array: [String] = someString.map { String($0) }
var array2: [Character] = Array(somerString)
var array3: [String] = Array(arrayLiteral: someString)
var newString = array.joined()
newString = array3.joined()
var newString2 = String(array2)
활용
someString = "Swift"
someString.randomElement()
someString.suffled()
newString3 = someString.map {String($0) }.shuffled().joined()
newString4 = String(someString.shuffled())
문자열의 인덱스
- 문자열의 인덱스는 정수가 아니다
- 스위프트에서는 문자열을 글자의 의미단위로 사용하기 때문에, 정수 인덱스 사용 불가
- 배열은 안에 들어가는 타입이 모두 같기 때문에, 각 원소의 메모리 사이즈가 같다.
하지만, 문자열은 글자마다 메모리 상의 데이터 사이즈가 다르기 때문에, 일정하지 않은 간격으로 데이터가 존재한다
let greeting = "Guten Tag!"
greeting.startIndex
print(greeting.startIndex)
greeting[greeting.startIndex]
var someIndex = greeting.index(greeting.startIndex, offsetBy: 2)
greeting[someIndex]
someIndex = greeting.index(after: greeting.startIndex)
greeting[someIndex]
someIndex = greeting.index(before: greeting.endIndex)
greeting[someIndex]
for index in greeting.indices {
print("\(greeting[index]) ", terminator: "")
}
print("")
for char in greeting {
print("\(char) ", terminator: "")
}
var firstIndex = greeting.firstIndex(of: " ")!
var nextOfEmptyIndex = greeting.index(firstIndex, offsetBy: 1)
greeting[nextOfEmptyIndex]
var thirdCharIndex = greeting.index(greeting.startIndex, offsetBy: 2)
greeting[thirdCharIndex]
let lower = greeting.index(greeting.startIndex, offsetBy: 2)
let upper = greeting.index(greeting.startIndex, offsetBy: 5)
greeting[lower...upper]
var range = greeting.range(of: "Tag!")!
greeting[range]
range = greeting.range(of: "tag", options: [.caseInsensitive])!
greeting[range]
삽입, 교체, 추가, 삭제
var welcome = "Hello"
welcome.insert("!", at: welcome.endIndex)
welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
welcome = "Hello there!"
if let range = welcome.range(of: "there!") {
welcome.replaceSubrange(range, with: "Swift!")
}
var newWelcome = welcome.replacingOccurrences(of: "Swift", with: "World")
newWelcome = welcome.replacingOccurrences(of: "swift", with: "New World", options: [.caseInsensitive], range: nil)
"swift" + "!"
welcome.append("~")
welcome.append(" Awesome!")
welcome = "Hello Swift!"
welcome.remove(at: welcome.index(before: welcome.endIndex))
var range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
welcome.removeAll()
welcome.removeAll(keepingCapacity: true)
활용
var string = "Hello world"
if let someIndex = string.firstIndex(of: " ") {
string.insert(contentsOf: " super", at: someIndex)
}
if let firstIndex = string.firstIndex(of: " ") {
let range = firstIndex...string.index(firstIndex, offsetBy: 5)
string.removeSubrange(range)
print(string)
}
if let range = string.range(of: " world") {
string.removeSubrange(range)
print(string)
}
문자열 비교
단순 비교
"swift" == "Swift"
"swift" != "Swift"
"swift" < "Swift"
var a = "swift"
var b = "Swift"
var result = a.caseInsensitiveCompare(b)
switch result {
case .orderedAscending:
print("오름차순")
case .orderedDescending:
print("내림차순")
case .orderedSame:
print("동일한 차순")
}
a.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
문자열 비교 메서드
- 다양한 옵션 적용이 가능해서 비교를 여러가지 방식으로 활용할 수 있다
var name = "Hello, Swift"
name.compare("hello", options: [.caseInsensitive]) == .orderedDescending
문자열 포함여부 및 앞뒤 글자 반환
let string = "Hello, world!"
string.contains("Hello")
string.lowercased().contains("hello")
string.contains("world")
string.hasPrefix("Hello")
string.hasPrefix("world")
string.lowercased().hasPrefix("world")
string.hasSuffix("!")
string.hasSuffix("world!")
string.prefix(2)
string.suffix(3)
string.commonPrefix(with: "Hello, swift")
string.commonPrefix(with: "hello", options: [.caseInsensitive])
string.dropFirst(3)
string.dropLast(3)
잘봤습니다 감사합니다