일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 캐러셀
- fetchdescriptor
- xcode 엔터 표시
- png
- JPG
- 클린 아키텍처
- 타뷸레이션
- xcode 공백 표시
- Firestore
- 팀 개발을 위한 git
- contentalignmentpoint
- .pbxproj
- 코드스쿼드
- webp
- swift 모듈화
- swiftdata
- 함께자라기
- Tuist
- TestFlight
- heic
- 무한스크롤
- 테스트 타겟
- spm 에러
- 메모이제이션
- nidthirdpartylogin
- JPEG
- NVME
- Cocoa Pod
- SwiftUI
- github 시작하기
- Today
- Total
Sure, Why not?
Split과 Components 차이 본문
매번 코테에서 문자열 쪼개는 상황마다 두 녀석 중 무엇을 쓸지 고민하였습니다.
매번 고민한다는 것은 두 녀석들을 완전히 이해를 못 하고 있는 의미이고,
이번 시간을 통해 정리하고자 합니다.
리턴타입 기준으로
Split
func split(
separator: Self.Element,
maxSplits: Int = Int.max,
omittingEmptySubsequences: Bool = true
) -> [Self.SubSequence]
SubSequence 배열을 반환합니다.
String기준으로 Substring은 원본 문자열의 일부를 참조하는 타입입니다.
Substring은 Copy On Write의 메모리 효율성을 위한 설계에 의하여,
원본 문자열의 메모리를 공유하기 때문에 메모리를 추가로 할당하지 않습니다.
Components
func components(separatedBy separator: String) -> [String]
String 배열을 반환합니다.
이는 원본 문자열로부터 새로운 인스턴스를 생성하기 떄문에, 메모리를 할당합니다.
Import 기준
split은 Swift Standard Library에 포함되어 있어 바로 사용할 수 있습니다.
Swift Standard Library | Apple Developer Documentation
Solve complex problems and write high-performance, readable code.
developer.apple.com
반면에, components는 Foundation을 import해야 사용할 수 있습니다.
이제 코드로 확인해보면 차이를 더 직관적으로 파악할 수 있습니다.
import Foundation
let x = "oxooxoxxox"
let y = x.split(separator: "x")
let z = x.components(separatedBy: "x")
print(y) // ["o", "oo", "o", "o"]
print(z) // ["o", "oo", "o", "", "o", ""]
split은 기본적으로 연속된 구분자가 나오는 결과에서 빈 문자열은 제거가 됩니다.
그래서 결과가 다르게 나타나는 것입니다.
그런데, y와 z의 결과를 동일하게 만들려면
import Foundation
let x = "oxooxoxxox"
let y = x.split(separator: "x", omittingEmptySubsequences: false)
let z = x.components(separatedBy: "x")
print(y) // ["o", "oo", "o", "", "o", ""]
print(z) // ["o", "oo", "o", "", "o", ""]
omittingEmptySubsequences를 false로 설정하면 빈 문자열도 결과에 포함되어 동일한 결과가 얻어지는 것을 확인할 수 있습니다.
omittingEmptySubsequences 는 직역하면 빈 부분 시퀀스 생략으로,
내용이 없는 빈 요소들을 결과에서 제외할지 결정하는 매개변수이기 때문입니다
😎정리
그래서 Spilt이 더 세심한 설정을 할 수 있다는 것을 확실히 이해할 수 있었고,
코테에서 바로 사용할 때는 연속된 구분자 사이에 빈 문자열을 나타내고자 할 때는, 물론 두 녀석다 표현할 수 있지만
components를 애용할 것 같습니다.
그러나 메모리를 신경써야할 때는 자연스럽게 split 사용할 것 같습니다. :)
'💻' 카테고리의 다른 글
PNG와 JPEG의 차이 (2) | 2024.09.05 |
---|---|
Memory Leak 메모리 누수 (0) | 2024.09.02 |
Virtual Memory 가상 메모리 (2) | 2024.09.01 |
List 데이터 식별하는 방법 (0) | 2024.08.31 |
final하면 왜 좋을까? (1) | 2024.08.29 |