반응형

swift 8

swift. 중첩 클로져(nested closure)에서 weak self 사용?

weak self weak self 는 순환 참조(strong reference cycle)를 방지하기 위해 사용한다. 일반적으로는 escaping closure에서 self를 사용할 때, 캡쳐리스트에 선언해두고 사용한다. escaping closure에서 self를 캡쳐하면 strong reference cycle(Automatic Reference Counting in Swift Docs)이 발생하기 쉽기 때문이다. class Fetcher { var x: String? func callFetch() { self.fetchSomething { [weak self] error in self?.x = "finished" print("error : \(error)") } } func fetchSometh..

iOS/Swift 2022.04.27

swift final class. final 키워드

어느 날 PR 리뷰에 이런 코멘트가 달렸다. class newClass { > >final 키워드를 붙여주세요. 새로 생성한 class는 한 곳에서 단 한가지 용도로 사용되었다. 사실 final을 생각하면서 붙이지 않았다. 그래서 생각해보기로 했다. swift org에서 final을 이렇게 설명하고 있다. You can prevent a method, property, or subscript from being overridden by marking it as final. final을 지정하면, overriding을 컴파일 단계에서 막는다. class 에 final을 붙이면 해당 클래스는 subclassing 할 수 없다. 상속 불가. override 불가. 상속과 method override를 막는 효..

iOS/Swift 2022.04.22

Swift. Ambiguous use of 'init'

아래와 같은 형태로 코드를 작성했다. 그런데 계속 에러가 뜨면서 빌드가 안됬다. class URLProviderFactory { private let url: URL init(_ url: URL) { self.url = url super.init() } .... } class A { private func makeURLProvider(_ url: URL) { let urlProvider = url.map(URLProviderFacoty.init) } .... } Error : Ambiguous use of 'init' 말그대로 init을 이상하게(모호하게) 썼다는 뜻이다. 어떻게 해도 저 에러가 뜨길래.... struct가 아닌 class로 구현한 것에 init을 적용해서 생긴 이슈라고 생각했다.(잘못된..

iOS/Swift 2022.04.21

RxSwift 는? Reactive 프로그래밍을 알아보자 1

이전에 Combine 에 대해 알아보면서 RxSwift를 언급했다. Reactive Programming 이라는 사실만 알 뿐, 실제로 사용해서 개발한 경험은 없다. 결국엔 iOS 네이티브를 한 번 랩핑해놓은 서드파티 라이브러리 라고 생각했기 때문이었다. 비동기 처리를 위해 거대한 서드파티 라이브러리를 개발에 포함시키고 싶지 않았다. Apple에서 정식으로 지원하는 것도 아니기에 굳이 위험부담을 감수할 필요가 없었다. 그런데 이번에 합류한 조직에서 RxSwift를 적극 사용한다고 한다. 그래서 RxSwift와 조금 친해져보려고 책을 펼쳤다. RxSwift: Reactive Programing with Swift RxSwift: Reactive Programming with Swift Leverage th..

iOS/Swift 2022.02.04

Combine은 무엇인가.(비동기 연산 처리 지원 프레임워크)

요즘 iOS 개발, 그 중에서도 Swift 언어로 개발하는 곳에는 Combine이 핫한 이슈인 것 같다. 여기저기서 "이제 combine을 적용해야 하는데...", "combine으로 넘어가야겠어." 라는 소리가 들린다. 어렴풋이 저기 어딘가 있는 Combine을 한번 알아봤다. WWDC2019에서 처음 소개된 Combine은 iOS13버전 부터 사용이 가능하다. 아래는 Apple Developer 사이트에서 제공하는 Combine 에 대한 설명이다. 가져와서 한글로 옮겨봤다. Combine event-processing operator (이벤트 처리 연산자)를 결합(combining)해서 비동기 이벤트를 입맛에 맞게 핸들링하도록 하는 프레임워크. iOS 13.0+ iPadOS 13.0+ 요약 Combi..

iOS/Swift 2022.01.20

다중 작업이 동시에 끝날 때 까지 기다리려면 DispatchGroup

순서에 상관없이 여러 작업이 끝난 뒤에 어떤 작업이 실행되어야 하는 경우가 있다. 몇년 전에 나도 같은 케이스를 만나서 두 작업이 모두 완료 되는 순간을 어떻게 알 수 있을까 고민한 적이 있다. 다양한 방법을 사용할 수 있겠지만, 나는 그 때 DispatchGroup을 활용하기로 결정했다. 예를 들어 Thumbnail과 Description을 별도의 URL에서 받아서 노출해야 하는 경우가 있다고 해보자. 썸넬을 받아오는 Task 하나, 글자를 받아오는 Task 하나가 각각 동시에 실행 되도록 한다. 둘 중 어느 작업이 먼저 끝날지는 알 수 없다.(또한 어느 것을 먼저 받아오는 것이 더 효율적인지도 알 수 없다. 그 판단은 시스템이 한다.) 두 작업이 모두 완성 되면, 두가지 정보를 조합해서 화면에 노출하..

개발 Story 2021.12.07

WWDC21 Protect mutable state with Swift actors #1<Actor, Actor Reentrancy>

Avoiding data races concurrent program의 가장 어렵고 기본적인 문제. 데이터 경합(data race)? 두개 이상의 쓰레드(thread)가 동시에 같은 데이터에 접근하고, 이 중 한 쓰레드라도 쓰기(write)작업을 하는 경우에 발생하는 데이터 정합성 문제. 발생하는 경우가 드물다. -> 디버깅도 어렵다. Counter example class Counter { var value = 0 func increment() -> Int { value = value + 1 return value } } let counter = Counter() asyncDetached { print(counter.increment()) } asyncDetached { print(counter.inc..

iOS 2021.07.04

WWDC21 Explore structured concurrency in Swift

일전에 번역해서 그대로 올렸더니, 문제가 되는 것 같아서 비공개로 전환했던 글이다. 새로 정리하여 재 작성했다. 처음에는 원문을 그대로 살리는 데 집중했다면, 이번에는 내용을 이해해보려고 노력했다. Let's dive in. said Kavon Structured concurrency in Swift Swift 5.5 의 새로운 동기화 기법. (structured programming 에서 영감을 얻어서 만듬.) 구조적 프로그래밍이란? 코드의 control-flow를 순차적(top-down)으로 읽을 수 있도록 구조화한 프로그래밍 방식. if-else 가 대표적인 예제 코드의 블럭화(Swift에서는 static scoping이라고 부름)로 구조적 프로그래밍이 가능. 블럭 내 (if절 내 or else 절..

iOS 2021.06.17
반응형