🤔 글을 시작하며Swift를 쓴다면 map, flatMap, compactMap정도는 알 것이다. 이 글에서는 이 세 개의 차이를 말하기보단 세부 구현에 대해서 알아보고자 한다. 차이만 알고 싶다면... 아래의 예시만 참고하면 될 것 같다. map은 배열을 1:1로 다른 타입으로 매핑한다.let numbers = [1, 2, 3]let strings = numbers.map { "\($0)" }// ["1", "2", "3"]compactMap은 배열을 1:1로 다른 타입으로 매핑하면서 nil값은 없애준다.let strings = ["1", "2", "삼", "4"]let numbers = strings.compactMap { Int($0) }// [1, 2, 4]flatMap은 배열을 펼쳐준다.let..
→ Swift Study
🤔 간단한 실험아래의 코드를 실행시키면 어떻게 될까?let numbers = [1,2,3,4,5,6]numbers.forEach { number in if number == 2 { return } print(number)}당연하게도 2를 제외한 1, 3, 4, 5, 6이 출력될 것이다. 그렇다면 아래의 코드는?for number in numbers { if number == 2 { return } print(number)}바로바로 아래와 같이 오류가 발생하게 된다.엇 두개의 정확한 차이가 뭘까?🧑🏻💻 내부 구현Swift는 오픈소스이기 때문에 내부구현을 찾아볼 수 있었다. swift/stdlib/public/core/Sequence.swift at 376651df4db8d76..
🫠 String은 왜 index가 까다로울까?항상 String을 사용하다 보면 아래와 같이 반복문은 쓸 수 있는데 index로 접근하지 못할까?라는 생각을 많이 해봤다.아래와 같이 특별한 index로 접근해야 접근이 가능하다. 왜 굳이 복잡하게 이렇게 되어있을까? 궁금했다.🔤 가변길이 인코딩우선 이것을 생각해보기 전에 문자의 용량에 대해서 알아보고자 한다. "Hello, 👋" 의 길이(용량)는 얼마일까? 아래처럼 프린트해 보면 11이 나온다. 엇 잠깐? 일단 "Hello, 👋" 의 길이는 8인데 왜 11이라는 숫자가 나온걸까?하나하나 출력해 보면 마지막 손바닥이 4이다. 여기서 숫자는 16진수 두 자리로 된 byte라고 볼 수 있다.하나의 String에 여러 용량을 가진 요소들이 저장되어 있구나를..
WWDC24 영상아래의 영상에 아주 잘 설명이 나와있으므로 참고하면 좋을 것 같다. SwiftUI essentials - WWDC24 - Videos - Apple DeveloperJoin us on a tour of SwiftUI, Apple's declarative user interface framework. Learn essential concepts for building apps in SwiftUI, like...developer.apple.comSwiftUI의 특징SwiftUI는 다음과 같은 세가지 특징이 있다. 선언적, 구성적, 상태 중심의 특징을 가지고 있다. 아래와 같이 원하는 뷰를 행을 추가하거나 제거하는 작업 없이 UI를 만들 수 있다. pets가 업데이트 된다면 자동으로 행이 변경..
갑자기?SwiftUI의 기본중에 기본이라고 할 수 있는 @State, @Binding에 대해서 다시한번 짚어보고 싶어서 포스팅을 남긴다.기본 설명아래와 같이 초 간단한 뷰를 만들어봤다.조금 특이한(?) 점은 아래와 같이 상위 뷰에서 하위 뷰에 count를 전달할 수 있다.struct ContentView: View { @State private var count = 0 var body: some View { List { Section("Content View") { Stepper("\(count)", value: $count) } Section("Counter View..
Swift의 do, try, catch 구문은 에러 처리를 위한 구문이다. 보통 아래와 같은 형태를 많이 발견할 수 있다. do { // 예외가 발생할 수 있는 코드를 포함하는 블록 try // 예외가 발생할 수 있는 작업을 호출 } catch { // 예외가 발생했을 때 처리할 코드 } 코드 실습 아래와 같은 코드가 있다고 해보자. fetch 함수는 "Fetched" 를 반환하는 함수이다. 이 함수는 throws 를 통해 에러를 던지는 함수라는 것을 알 수 있다. isActive 를 받아서 false 면 에러를 던진다. enum fetchError: Error { case unknown case network } func fetch(_ isActive: Bool) throws -> String { if..
Swift 를 사용하면서 본인도 모르게 self. 를 많이 사용했을 것이다. self 는 말그대로 나 자신! 이라는 뜻을 가지고 있다. 그렇다면 [weak self] 는 무엇일까? 실습을 통해 아주 간단하게 맛보기만 보려고 한다.약한참조간단하게 ARC 에 대해서 설명해 보자면, Swift에서는 ARC(Automatic Reference Counting, 자동 참조 카운팅)를 사용하여 객체의 메모리를 관리한다. 이 참조를 약한 참조(weak)로 만들면 참조 카운트가 증가하지 않는다. ARC 에 의해서 참조 카운팅이 0 이 되었을때 메모리에서 해제가 되는데 강한 참조가 걸려있으면 카운팅이 0 이 되기전까지 해제되지 않는다. 예시코드기본 구조아래같이 Navigate 버튼을 누르면 다음뷰로 가고 다음뷰는 He..
지난 시간 지난 시간에는 GCD 의 종류에 이어서 DispatchGroup, DispatchWorkItem, Semaphore 까지 다양한 방법으로 비동기 작업을 할 수 있는 방법에 대해서 알아보았다. 하지만 이러한 비동기 처리를 하게 되면 발생되는 문제들이 있다. 이번 포스팅에서는 문제들을 역시나 간단하게 알아보려고 한다. (심화과정은 제가 더 공부해야 할 것 같아요) [Swift] GCD/Operation 알아보기 3 - DispatchGroup 지난시간 지난시간엔 GCD 종류에 대해서 알아보았다. 메인큐, 글로벌큐, 커스텀큐 이렇게 세종류가 있는데 이러한 것들을 묶을 수 있고, 그 그룹이 끝나는 시점을 알고싶을때 사용하는 것이 Dispat swift-library.tistory.com Thread-..