
Publisher+Utils.swift import Foundation import Combine extension Publisher { static func empty() -> AnyPublisher { return Empty().eraseToAnyPublisher() } static func just(_ output: Output) -> AnyPublisher { return Just(output) .catch { _ in AnyPublisher.empty() } .eraseToAnyPublisher() } static func fail(_ error: Failure) -> AnyPublisher { return Fail(error: error).eraseToAnyPublisher() } } Netw..

iOS 에서는 HTTP 방식으로 네트워크 할 수 있으며 URLSession 을 사용합니다 URLSession URLSession을 이용해서 서버와 소통 URLSessionConfiguration .default 디스크를 이용한 정보 저장을 하는 configuration 그냥 브라우저 띄울때 .ephemeral default 랑 비슷한데, 몇가지 정보들을 저장하지 않음 (쿠키, 인증서 등) 브라우저 시크릿 모드라고 생각하면 쉬움 .background 네트워크를 통해 파일 다운로드 받을때, 앱이 백그라운드에서 돌때도, 다운로드 시켜줄수 있음 URLSession configuration 을 보고, 세션을 생성 URLSessionTask dataTask uploadTask downloadTask URLSessi..

Combine 초기화 컴바인 subscription 저장소를 만들어줍니다 var subscription = Set() 입력용 publisher 를 설정 해줍니다 let didSelect = PassthroughSubject() 출력용 publisher 를 설정 해줍니다 let items = CurrentValueSubject(AppleFramework.list) 구독 기능 수행을 위한 함수 함수 실행 시, input 과 output 에 대한 구독을 진행합니다 Input input 에 데이터가 추가되면 관련 기능이 수행됩니다 output input 에 의한 기능 수행되면 자동으로 output 의 데이터가 자동으로 전달되며 output 에 대한 기능이 수행됩니다 private func bind() { // ..

Scheduler on : 스레드 를 통해서 연산 스레드와 결과 수신 스레드를 구분하여 효율을 올릴 수 있습니다 아래 코드 역시 map 을 통해 연산하는 스레드는 queue 라는 서브 스레드를 통해 진행하고 receive 를 통해 결과는 메인 스레드에서 처리하는 것을 알 수 있습니다 import Foundation import Combine let arrPublisher = [1, 2, 3].publisher let queue = DispatchQueue(label: "custom") let subscription = arrPublisher .subscribe(on: queue) .map { value -> Int in print("transform: \(value), thread: \(Thread.cu..

.sink 기본 구독 방식입니다 Publisher에서 전달받은 값에 대하여 코드를 실행합니다 기본적으로 전달받은 값에 대한 코드를 실행하지만 실행 전, subscription에 대한 성공 / 실패 여부에 따른 코드도 추가로 실행 가능합니다. import Foundation import Combine let arrayPublisher = [1, 2, 3, 4, 5].publisher let arraySubscriber = arrayPublisher.sink { value in print("recived value : \(value)") } /* recived value : 1 recived value : 2 recived value : 3 recived value : 4 recived value : 5 *..

Just 한 개의 값(value) 를 전달합니다. 다른 Publisher와 달리 배열을 just로 전달하면 배열의 각 값을 전달하는 것이 아니라 배열이라는 하나의 값을 통채로 전달합니다 import Foundation import Combine let justPublisher = Just(1000) let justSubscriber = justPublisher.sink { value in print("recived value : \(value)") } /* recived value : 1000 */ .publisher 객체를 Publisher로 만들어 줍니다 한 개의 값이면 한 개의 값을 전달하고 ( Just와 동일 ) 배열 등의 객체면 해당 객체의 값을 순차적으로 전달합니다 import Foundati..

Combine 에는 Publisher, Subscriber, Operator 세 가지 컴포넌트가 있습니다 각 컴포넌트를 쉽게 이해하려면 Publisher 는 생산자, 배출자, 크리에이터, 배설자 Subscriber 는 소비자, 구독자, 받는 사람 Operator 는 변경시키는 사람, 마법사, 가공 하는 사람 이라고 생각하면 될 겁니다. Publisher Publisher 는 데이터를 배출합니다 구체적인 output 및 실패 타입을 정의하고 Subscriber 가 요청한것 만큼 데이터를 제공합니다 빌트인 Publisher인 Just, Future 가 있습니다 Just 는 값을 다룹니다 Future 는 Function 을 다룹니다 iOS 에서는 자동으로 제공해주기도 합니다 NotificationCenter ..

랜덤 텍스트 설정 let cities = ["Seoul","Tokyo","LA","Seattle"] ... cityLabel.text = cities.randomElement() 랜덤 이미지 설정 let weathers = ["cloud.fill","sun.max.fill","wind","cloud.sun.rain.fill"] ... let weather = weathers.randomElement()! weatherImageView.image = UIImage(systemName: weather)?.withRenderingMode(.alwaysOriginal) 랜덤 숫자 설정 let randomTemp = Int.random(in: 10..

// date fomatter func formattedDateString(dateString: String) -> String { let formatter = DateFormatter() formatter.dateFormat = "yyyy.MM.dd" if let date = formatter.date(from: dateString) { // formatter.dateFormat = "M/d" formatter.dateFormat = "yy.MM.dd" return formatter.string(from: date) } else { return "" } }

// 가격 : 3자리 마다 콤마 찍기 func convertToCurrencyFormat(price: Int) -> String { let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal numberFormatter.maximumFractionDigits = 0 let result = numberFormatter.string(from: NSNumber(value: price))! return result }

익스텐션 기존 타입에 새로운 역할(기능 및 속성)을 추가하고 싶을 때 사용합니다 extension String { func contains(s: String) -> Bool { return self.range(of: s) != nil } func replace(target: String, with: String) -> String { return self.replacingOccurrences(of: target, with: with) } } let testString = "Hello iOS Developer!!" let replaced = testString.replace(target: "Hello", with: "안녕하세요") print(replaced) //안녕하세요 iOS Developer!! pr..

프로토콜 프로토콜은 제공하고 싶은 역할(기능, 속성)을 미리 정의해 놓은 것 이후에 다른 타입이 해당 프로토콜의 역할을 제공하고 싶으면, conform 해서 제공함 자바의 추상클래스와 비슷하다고 생각하면 됩니다 필드의 getter, setter 설정 가능합니다 protocol Coach { var name: String { get set } var currentTeam: String { get } func training() func direct() } struct Mourinho: Coach { var name: String = "Jose Mourinho" var currentTeam: String = "AS Roma" func training() { print("Traing Player") } fun..