Swift로 문자열 문제를 풀다보면 오류를 자주 접하게 된다.
(error: cannot convert value of type 'String.Element' (aka 'Character') to closure result type 'String)
'이게 왜 안됨? ㅋㅋ' 라는 생각이 들 정도로 안된다.
아무튼 이런 오류를 자주 접했기에 글로 정리하면서 다시 한 번 복습하려고 한다.
1. 문자열 형 변환하기
1. String -> Int
다른 언어에서처럼 Int()로 형 변환을 진행한다.
이 때, String인지 SubString인지 Character인지 잘 살펴본다.
(그렇지 않으면... error: cannot convert value of type 'String.Element' (aka 'Character') to closure result type 'String')
var a: String = "1"
var b: Substring = "2"
var c: Character = "3"
print(Int(a)) // Optional(1)
print(Int(b)) // Optional(2)
print(Int(c)) // Error!
2. Int -> String
var a: Int = 1
print(String(a)) // 1
3. 다른 기본 타입들
String -> Int 와 동일하다.
String과 Character, Optional에 주의한다.
2. 문자열을 한 개씩 분리하기
하나의 문자열을 하나의 문자로 나눠야할 때는 map을 사용한다. 반환 값이 [Character] 타입이므로 주의한다.
var s: String = "abcdefg"
var characters: [Character] = s.map { $0 } // [Character]
var strings: [String] = s.map { String($0) } // [String]
3. 문자열을 특정 문자를 기준으로 나누기
문자열을 공백이나 기호를 기준으로 나눌 때는 split이나 components를 사용한다.
1. split
반환 결과가 [SubString] 타입이므로 [String] 타입이 필요한 경우 형 변환을 해준다.
var s: String = "a b c d e f g" // 공백이 존재
var subStrings: [SubString] = s.split(separator: " ").map { $0 } // [SubString]
var strings: [String] = s.split(separator: " ").map { String($0) } // [String]
2. components
비슷하게 components가 있고, Foundation import를 통해 사용할 수 있으며 반환 값이 [String] 타입이다.
import Foundation
var s: String = "a b c d e f g" // 공백이 존재
var strings: [String] = s.components(separatedBy: " ")
4. 문자열 내 특정 문자 포함 여부
1. contains
var s: String = "kodo"
var a: String = "k"
var b: Character = "k"
var c: Substring = "k"
print(s.contains(a)) // true
print(s.contains(b)) // true
print(s.contains(c)) // true
2. hasPrefix
앞에서부터 문자열을 비교한다.
hasPrefix 메소드에 넘겨주는 인자는 String 타입이어야 한다.
var s: String = "kodo"
var a: String = "k"
var b: Character = "k"
print(s.hasPrefix(a)) // true
print(s.hasPrefix(b)) // Error!
3. hasSuffix
hasPrefix와 반대로 뒤에서부터 문자열을 비교한다.
var s: String = "kodo"
var a: String = "k"
var b: Character = "k"
print(s.hasSuffix(a)) // false
print(s.hasSuffix(b)) // Error!
var c: String = "o"
var d: String = "do"
var e: String = "odo"
var f: String = "kod"
print(s.hasSuffix(c)) // true
print(s.hasSuffix(d)) // true
print(s.hasSuffix(e)) // true
print(s.hasSuffix(f)) // false
5. 문자열 내 특정 위치, 문자 반환
1. startIndex, endIndex
Swift에서는 문자열에 인덱스로 직접적으로 접근할 수 없다.
String[index]가 불가능하고, String[String.index]로 접근할 수 있다.
startIndex는 문자열의 첫 인덱스를, endIndex는 문자열의 마지막 인덱스 + 1을 반환한다.
var s: String = "kodo"
var start: String.Index = s.startIndex
var end: String.Index = s.endIndex
print(s[0]) // Error!
print(s[start]) // k
print(s[end]) // Error!
이를 활용해서 문자열 파싱이 가능하다.
var s: String = "kodo"
var start: String.Index = s.startIndex
var end: String.Index = s.endIndex
print(s[start..<end - 1]) // kodo
print(s[start...) // kodo
2. firstIndex
firstIndex 메소드에 넘겨주는 인자가 처음 등장하는 인덱스를 반환한다.
인자는 Character 타입이고, 반환 값이 없을 수도 있기에 해당 메소드의 반환 타입은 Optional이다.
var s: String = "kodo"
var e1: String = "o"
var index: String.Index? = s.firstIndex(of: e1) // Error!
var e2: Character = "o"
var index: String.Index? = s.firstIndex(of: e2) // Optional(...)
3. index
특정 인덱스 이전, 이후의 인덱스에 접근할 수 있다.
after의 경우 after 이후의 인덱스를, before의 경우 before 이전의 인덱스를 반환한다.
var s: String = "kodo"
var start = s.startIndex // 0
var end = s.endIndex // 4
print(s[s.index(after: start)]) // s[1] = o
print(s[s.index(start, offsetBy: 0)]) // s[0] = k
print(s[s.index(start, offsetBy: 1)]) // s[1] = o
print(s[end]) // Out of Bounds
print(s[s.index(before: end)]) // s[3] = o
print(s[s.index(end, offsetBy: -1)]) s[3] = o
6. 아스키코드 변환하기
문자를 아스키코드로 변환하거나, 아스키코드를 문자로 변환할 때는 UnicodeScalar를 사용한다.
1. String -> ASCII
아스키코드로 변환할 때는 UnicodeScalar에 넘겨주는 인자가 String 타입이어야 한다.
또한 변환 결과가 Optional이므로 강제 언래핑을 진행한다.
var s: String = "kodo"
var stringToAscii: [Int] = s.map { UnicodeScalar($0)?.value } // Error!
var stringToAscii: [Int] = s.map { UnicodeScalar(String($0))?.value } // Error!
var stringToAscii: [UInt32] = s.map { UnicodeScalar(String($0))!.value } // 107 ...
var stringToAscii: [Int] = s.map { Int(UnicodeScalar(String($0))!.value) } // 107 ...
2. ASCII -> String
역시 UnicodeScalar의 결과가 Optional이므로 강제 언래핑을 진행한다.
var asciis: [Int] = [107, 111, 100, 111]
var asciiToString = asciis.map { String(UnicodeScalar($0)!) }.joined() // joined로 문자열 변환
7. 문자열 뒤집기
Collections 타입의 reversed를 활용한다.
var s: String = "kodo"
print(s.map { String($0) }.reversed().joined()) // "odok"
'💻 개발 > iOS' 카테고리의 다른 글
[iOS / SwiftUI] OnAppear, OnDisappear는 언제 호출될까? (1) | 2022.12.01 |
---|---|
[iOS / SwiftUI] 스크롤, 무한으로 즐겨요~ (LazyVStack으로 무한 스크롤 구현하기) (0) | 2022.11.28 |
[iOS / SwiftUI] 다양한 상태 프로퍼티들을 알아보자! (0) | 2022.10.24 |
[iOS / SwiftUI] 키보드가 사라지지 않아요...😩 (0) | 2022.10.21 |
[iOS / SwiftUI] ForEach로 View를 리펙토링 해볼까요? (0) | 2022.10.11 |