본문 바로가기

Swift25

[Swift] 인터페이스 설계: 클래스 기반과 컴포지션 패턴의 비교 소프트웨어 설계에서 인터페이스와 클래스 구조를 어떻게 구성하느냐에 따라코드의 유지보수성, 확장성, 재사용성이 크게 달라집니다.이번 포스팅에서는 자동차 인터페이스를 설계하는 두 가지 접근 방식단일 클래스 기반 설계와 컴포지션 패턴을 비교해보고,이를 높은 응집력(High Cohesion)과 단일 책임 원칙(SRP) 관점에서 해석해 보겠습니다.1️⃣ 첫 번째 예제: 단일 클래스 기반 설계첫 번째 방법은 자동차의 각 기능을 구체적인 클래스에서 직접 구현하는 방식입니다.예를 들어 현대소나타, 현대아이오닉, 현대코나하이브리드와 같은 클래스는 각각 달리기, 멈추기그리고 각 자동차 유형에 맞는 경고 기능을 구현합니다.💡 인터페이스 정의protocol 달리기능력 { func 달리기()}protocol 멈춤능력 { fu.. 2024. 8. 13.
[Swift] Task, async let, Task Group 동시 작업의 모든것 비동기 작업을 수행할 때, 여러 개의 작업을 동시에 진행해야 하는 경우가 있습니다. 이를테면, 두 개의 이미지를 다운 받고, 그 두개의 이미지를 return하는 작업이 있을 수 있습니다. 다음은 코드 예시입니다. func fetchTwoURLs() async throws -> (Data, Data) { let url1 = URL(string:"https://www.apeth.com/pep/manny.jpg")! let url2 = URL(string:"https://www.apeth.com/pep/moe.jpg")! let data1 = try await self.download(url: url1) let data2 = try await self.download(url: url2) return (data.. 2024. 3. 7.
[Swift] Actor, @MainActor, Task, Sendable의 모든것 Actor기본적으로 액터의 코드는 백그라운드 스레드에서 실행됩니다. Swift의 구조적 동시성에서 스레드는 낮은 수준에서 존재하며, 코드는 어떤 스레드에나 할당될 수 있습니다. 메인 스레드와 백그라운드 스레드의 구별은 중요하며, 이를 위해 '액터'라는 개념이 사용됩니다. 액터를 사용하면 코드가 어떤 스레드에서 실행되어야 하는지를 명시할 수 있으며, 이를 통해 복잡한 동시성 문제를 효과적으로 처리하고 코드를 깔끔하게 유지할 수 있습니다. Swift에서 Actor는 백그라운드 스레드에서 코드를 실행하는 데 도움이 되며, 멀티스레딩 코드를 안전하게 실행하는 데 중요한 역할을 합니다. 멀티스레딩 코드에서 가장 큰 문제점은 공유 상태의 문제입니다. 속성이 하나 이상의 스레드에서 변경될 수 있다면, 코드는 일관성 .. 2024. 3. 5.
[Swift] 비동기 메소드를 async/await 메소드로 변환하는 방법 (`withUnsafeContinuation`) Swift의 비동기 메소드를 async/await 메소드로 변환하기Swift 5.5는 비동기 프로그래밍을 간소화하는 새로운 기능을 도입했는데, 그 중 하나가 async/await 패턴입니다.이 패턴을 사용하면 비동기 코드를 알기 쉽고 깔끔하게 작성할 수 있습니다. 하지만 이미 작성된 비동기 메소드를 새로운 async/await 메소드로 변환해야 할 때가 있습니다.예를 들어, 아래와 같은 비동기 메서드가 있다고 가정합니다.이 코드를 수정할 수 없다면,어떻게 async/await 메서드에서 이 메서드를 호출할 수 있을까요?func download(url: URL, completionHandler: @escaping (Result) -> Void) { let task = URLSession.shared... 2024. 3. 2.
[Swift] Objective-C ↔ Swift 브릿징 Objective-C 에서 Swift 사용하는 방법#import "프로젝트 명-Swift.h"를 사용하면 swift 객체를 Objective-C 문법 그대로 활용 가능#import "ViewController.h" #import "프로젝트 명-Sift.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; popCalendarViewController = [[PopCalendarViewController alloc] init]; } - (IBAction)buttonClicked:(id)sender { popCalendarViewController.modalPres.. 2023. 12. 3.
[Swift] 메서드 체이닝을 활용하여 UIKit을 SwiftUI처럼 사용하기 View 객체를 생성할 때 어떻게든 코드를 편하게 작성해보려고 노력해봤지만기본 UIKit으로는 다음과 같이 가독성을 높이는데 한계점이 있었습니다. lazy var button1: UIButton = { let button = UIButton() var config = UIButton.Configuration.plain() config.title = "Plain Button" config.subtitle = "SubTitle" config.buttonSize = .medium config.image = UIImage(systemName: "swift") button.configuration = config button.addTarget(self, action: #selector(button1Tapped),.. 2023. 11. 13.