Notice
Recent Posts
Recent Comments
Link
clyne의 개발 기록
[Swift] SubString 편하게 확장해보자! 본문
안녕하세요~ IOS 개발자 CNOO입니다.
오늘은 문자열을 자르는 것을 해보려고 해요.
안드로이드 개발해보신 분들은 아시겠지만, Kotlin이라는 언어에는
subString
subStringAfter
subStringAfterLast
subStringBefore
subStringAfterLast
이러한 메서드들로 문자열을 자르고 편집하는데요,
Swift에는 따로 이러한 함수를 제공하지 않습니다.
Swift에서 제공하는 prefix, suffix, index 등의 함수들로 위에 있는 것과 같이 코틀린처럼 문자열 자르는 함수를 확장해보도록 하겠습니다.
prefix, suffix, index등의 swift언어의 문자열 관련 함수들은 구글링 해보시면 많은 자료가 나오니, 상세한 사용법은 생략하도록 하겠습니다.
String 에 대한 확장함수 추가
extension String.Index {
func distance<S: StringProtocol>(in string: S) -> Int { string.distance(to: self) }
}
extension Collection {
func distance(to index: Index) -> Int { distance(from: startIndex, to: index) }
}
extension StringProtocol {
func distance(of element: Element) -> Int? { firstIndex(of: element)?.distance(in: self) }
func distance<S: StringProtocol>(of string: S) -> Int? { range(of: string)?.lowerBound.distance(in: self) }
}
문자열의 위치를 반환해주는 distance 함수를 확장해준 후에,
extension String {
func subString(from: Int, to: Int) -> String {
if self.count <= 0 {
return self
}
let startIndex = self.index(self.startIndex, offsetBy: from)
let endIndex = self.index(self.startIndex, offsetBy: min(self.count-1, to))
return String(self[startIndex...endIndex])
}
func subString(from: Int) -> String {
if self.count <= 0 {
return self
}
let startIndex = self.index(self.startIndex, offsetBy: from)
let endIndex = self.index(self.startIndex, offsetBy: self.count-1)
return String(self[startIndex...endIndex])
}
func subStringAfterLast(char: Character) -> String {
if let index = self.lastIndex(of: char) {
return String(self.suffix(from: index)).subString(from: 1)
} else {
print("(subStringAfterLast) \(self) 문자열이 잘리지 않았습니다.\n 기준:\(char)")
return self
}
}
func subStringAfterFirst(char: Character) -> String {
if let index = self.firstIndex(of: char) {
return String(self.suffix(from: index)).subString(from: 1)
} else {
print("(subStringAfterFirst) \(self) 문자열이 잘리지 않았습니다.\n 기준:\(char)")
return self
}
}
func subStringBeforeLast(char: Character) -> String {
if let index = self.lastIndex(of: char) {
return String(self.prefix(upTo: index))
} else {
print("(subStringBeforeLast) \(self) 문자열이 잘리지 않았습니다.\n 기준:\(char)")
return self
}
}
func subStringBeforeFirst(char: Character) -> String {
if let index = self.firstIndex(of: char) {
return String(self.prefix(upTo: index))
} else {
print("(subStringBeforeFirst) \(self) 문자열이 잘리지 않았습니다.\n 기준:\(char)")
return self
}
}
func firstIndexOf(char: Character) -> Int {
return self.distance(of: char) ?? -1
}
func firstIndexOf(str: String) -> Int {
return self.distance(of: str) ?? -1
}
}
이렇게 String 에 대한 확장함수들을 추가해준 뒤에,
아래와 같이 사용하시면 끝!!
let string1 = "123@abc@456"
print(string1.subStringAfterLast(char: "@")) // 결과: 456
print(string1.subStringBeforeLast(char: "@")) // 결과: 123@abc
print(string1.subStringAfterFirst(char: "@")) // 결과: abc@456
print(string1.subStringBeforeFirst(char: "@")) // 결과: 123
print(string1.subString(from: 1)) // 결과: 23@abc@456
print(string1.subString(from: 0, to: 1)) // 결과: 1
정말 간단하죠?
혹시 예외 상황에 대한 처리가 안되어있는 부분이 있다면, 댓글로 남겨주시면 감사하겠습니다 :)
'iOS > Swift' 카테고리의 다른 글
[Swift] iOS에서 Visibility GONE 하기 (0) | 2021.05.03 |
---|---|
[Swift] 회전 애니메이션 (180도, 90도, 45도, 반시계방향) (0) | 2021.05.02 |
[Swift] 특정 모서리만 코너 Round주기 (corner, border) (0) | 2021.04.30 |
[Swift] 간단하게 nil을 필터링! CompactMap! (0) | 2021.04.29 |
[AVFoundation] 손전등 Torch (Flash) 사용법 (0) | 2021.04.28 |