Swift에서 Closure는 뭘까?
Language/Swift2024. 6. 29. 12:01Swift에서 Closure는 뭘까?

Closure코드에서 전달하고 사용할 수 있는 독립된 기능 블록self-contained blocks of functionality이다. 다른 언어의 클로저, 익명 함수, 람다 및 블록과 유사하다.// 일반적인 표현식{ () -> in }// closure: ascendingOrder let ascendingOrder: (Int, Int) -> Bool = { (lhs, rhs) -> Bool in return lhs value capture클로저의 주변 context의 상수와 변수를 capture 할 수 있다. 더 이상 존재하지 않더라도 클로저 본문 내에서 값을 참조하고 수정할 수 있습니다.접근할 수 있는 상수와 변수들을 close over 한다.incrementer 클로저는 total과 i..

새로워진 Swift 6 (WWDC24: What's new in Swift)
Language/Swift2024. 6. 19. 00:58새로워진 Swift 6 (WWDC24: What's new in Swift)

10년 간의 Swift 변천사2014년: Swift의 시작2015년: 오픈 소스로 전환, Linux에서도 사용 가능2016년: Swift 3, SPMSwift Package Manager 도입2017년: Swift 4, 최신 버전으로 마이그레이션하지 않아도 되는 기능이 추가2018년: Generics의 개선과 조건부 적합성Conditional Conformances 도입// 조건부 적합성extension Array: Comparable where Element: Comparable { static func , rhs: Array) -> Bool { // 비교 로직 }}2019년: SwiftUI, ABIApplication Binary Interface 도입2020년: Windows 포트가 s..

[Swift] Reactive Programming Combine - Resource
Language/Swift2024. 5. 29. 22:42[Swift] Reactive Programming Combine - Resource

Resource를 관리할 수 있는 2가지 연산자가 있습니다.sharemulticastshareupstream에서 받은 요소를 여러 subscibers에게 공유하는 Publisher.Share 클래스의 인스턴스입니다.연산자는 반환한 publisher는 여러 subscribers를 지원합니다.subscribers는 publisher로부터 변경되지 않은 요소와 완료 상태를 받습니다. Publisher.Share는 사실상 Publishers.Multicast 와 PassthroughSubject의 조합으로 암시적으로 autoconnect이 포함되어 있습니다. 처음 들어오는 subscriber와 함께 한 번 구독합니다. upstream에서 받은 값을 첫 subscriber 및 이후 구독하는 subscribers에..

[Swift] Reactive Programming Combine - Debugging
Language/Swift2024. 5. 19. 22:00[Swift] Reactive Programming Combine - Debugging

print모든 publisher 이벤트에 대한 log 메시지를 출력합니다.이벤트가 publisher를 통과하는지 확실하지 않을 때 사용하는 연산자입니다. print에는 TextOutputStream 객체를 받는 매개변수가 있습니다.이를 사용하여 원하는 형태의 로그를 출력할 수 있습니다. class TimeLogger: TextOutputStream { private var previous = Date() private let formatter = NumberFormatter() init() { formatter.maximumFractionDigits = 5 formatter.minimumFractionDigits = 5 } func write(_ string: String) { ..

[Swift] Reactive Programming Combine - Networking
Language/Swift2024. 5. 16. 22:59[Swift] Reactive Programming Combine - Networking

NetworkingCodabletryMap 내에서 JSON 디코딩하면 작동하지만 Combine에서 사용구를 줄이는 도움이 되는 연산자를 제공합니다.dataTaskPublisher(for:)은 튜플을 반환하므로 데이터 부분만 반환하기 위해 map을 사용하고 decode(type:decoder:) 연산자를 사용해야 합니다. tryMap에서 매번 생성하는 것과는 달리 publisher를 설정할 때, JSONDecoder를 한 번만 인스턴스화합니다.let subscription = URLSession.shared .dataTaskPublisher(for: url) .tryMap { data, _ in try JSONDecoder().decode(MyType.self, from: data)..

[Swift] Reactive Programming Combine - 7: Sequence
Language/Swift2024. 5. 16. 14:39[Swift] Reactive Programming Combine - 7: Sequence

Sequence Operatorsminmin 연산자를 사용하면 publisher가 방출한 최소값을 찾을 수 있습니다.최소값을 알기 위해서 publisher가 .finish 완료 이벤트를 보낼 때까지 기다립니다. 값이 Comparable을 준수하지 않는다면 min(by:)를 사용하면 됩니다.enum Rank: Int { case ace = 1, two, three, four, five, six, seven, eight, nine, ten, jack, queen, king}let cards: [Rank] = [.five, .queen, .ace, .eight, .king]cancellable = cards.publisher .min { return $0.rawValue  maxmin..

[Swift] Reactive Programming Combine - 6: Time manipulation
Language/Swift2024. 5. 16. 13:49[Swift] Reactive Programming Combine - 6: Time manipulation

Time Manipulation Operatorsdelay1초마다 값을 방출하는 publisher에서 값을 지연하여 방출할 수 있습니다.let valuesPerSecond = 1.0let delayInSeconds = 1.5let sourcePublisher = PassthroughSubject()let delayedPublisher = sourcePublisher.delay(for: .seconds(delayInSeconds), scheduler: DispatchQueue.main)let subscription = Timer .publish(every: 1.0 / valuesPerSecond, on: .main, in: .common) .autoconnect() .subscribe(sourcePu..

[Swift] Reactive Programming Combine - 5: Combining Operators
Language/Swift2024. 5. 11. 13:18[Swift] Reactive Programming Combine - 5: Combining Operators

Combining Operatorsprepend... synctax를 사용하여 다양한 값(원래 publisher와 동일한 유형)의 목록을 받습니다.let publisher = [3, 4].publisherpublisher .prepend(1, 2) .sink(receiveValue: { print($0) }) .store(in: &subscriptions) // *--- RESULUT ---*// 1// 2// 3// 4 prepend 연산자가 체인 연결을 하는 것은 접두사로 추가한다는 의미입니다.그렇기에 연산자의 순서가 중요합니다.let publisher = [3, 4].publisherpublisher .prepend(1, 2) .prepend(3, 4) .sink(receiveValue..

image