Swift: 약수(divisor) 구하기

약수 약수는 어떤 정수를 다른 정수로 나누어 떨어지게 하는 정수를 말합니다. 즉, 어떤 수를 다른 수로 나눌 때 나머지가 0이 되는 수들이 해당 수의 약수입니다. 예를 들어, 6의 약수는 1, 2, 3, 6이고, 12의 약수는 1, 2, 3, 4, 6, 12입니다. 약수는 양수일 필요는 없으며, 음수나 0도 가능합니다. 또한, 1과 더보기…

SwiftUI: Combine을 이용해 Debounce, Throttle 구현하기

소개 Debounce, Throttle 기능이 필요할 때 Combine을 이용해서 구현할 수 있습니다. Swift(스위프트): Debounce, Throttle 로 함수 실행 횟수 제한 (DispatchWorkItem 이용, 외부 라이브러리 없이) debounce, throttle를 간단히 요약하면 이벤트의 반복 실행시 콜백 함수의 불필요한 실행을 줄이는 역할을 합니다. 이로 인해 클라이언트가 혜택을 볼 수도 있거나 혹은 서버 측에 불필요한 리퀘스트를 더보기…

SwiftUI: 화살표 모양 그리기 (Shape, Path 사용)

SwiftUI에서 화살표 모양을 그리는 방법 원문: How to Create Arrow Shape in SwiftUI   소개 앱을 개발할 때, 사용자에게 알려줄 여러 기호가 필요하다는 것을 깨닫게 됩니다. 화살표는 움직임이나 방향을 나타내는 널리 알려진 기호입니다. SwiftUI의 유연성(flexibility)은 화살표의 생성과 방향 지정을 쉽게 할 수 있게 합니다. 🤔 SwiftUI에서 화살표를 추가하고 회전하는 방법을 더보기…

Swift UIKit: PDFKit에서 PDF 파일의 Annotation 지우개 구현

소개 인터넷에서 PDFKit과 Annotation을 다루는 예제를 찾았는데 이 저장소가 지우개 기능이 제대로 구현이 안되어 있기 때문에 참고용으로 포스트를 작성합니다. https://github.com/poluektov/pdfkit-ink-annotations   Step 1: 메인 화면에 지우개 버튼 추가 Main.storyboard 파일을 연 뒤 Bar Button Item과 Flexible Space를 추가한 뒤 화면 하단의 툴바에 삽입합니다. Bar Button Item의 텍스트를 Eraser로 변경하고 Assistant 더보기…

SwiftUI: SwiftUI의 View에서 UIRepresentableView(ViewController)에 접근하여 명령을 실행하는 방법

개요: SwiftUI와 UIKit을 연결하고 컨트롤하기 이미 이 주제와 관련하여 포스트를 작성한 적이 있습니다. SwiftUI: 웹 뷰(WKWebView) 추가하기 및 자바스크립트 실행 (Representable 사용) 그런데 위의 방법은 Combine의 PassthroughSubject를 이용하기 때문에 너무 비직관적이고 이해하기 어려워서 뷰모델만 사용한 그나마 약간 간략화된 방법을 소개하려고 합니다. (이 방법도 딱히 쉬운건 아닙니다.)   배경 SwiftUI에서 WebKitView를 더보기…

Swift: 우선 순위 큐 Priority Queue (설명 + 구현)

이전 글 Swift: 큐(queue) 구현하기   우선순위 큐 (Priority Queue) 힙 (Heap) 우선순위 큐 구현에서 가장 많이 사용하는 자료구조가 힙(Heap) 구조이므로 먼저 힙에 대해 아는 것이 좋습니다. 힙은 최댓값 및 최솟값을 찾아내는 연산을 빠르게 하기 위해 고안된 완전이진트리(complete binary tree)를 기본으로 한 자료구조(tree-based structure)입니다. 힙의 속성으로는 A가 B의 부모노드(parent node) 더보기…

Swift: 큐(queue) 구현하기

큐(Queue) 큐(queue)는 기본적인 자료 구조의 한가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로 저장하는 형식을 말합니다. 나중에 집어 넣은 데이터가 먼저 나오는 스택과는 반대되는 개념입니다. 프린터의 출력 처리나 운영체제의 메시지 처리기, 프로세스 관리 등 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용됩니다.   기본 배열을 더보기…

SwiftUI: 문서 폴더(Document Directory) 내부의 전체 폴더 구조(tree) 표시 (재귀 사용)

폴더(디렉토리) 표시용 모델 생성 import Foundation struct Folder: Codable, Equatable, Hashable, Identifiable, FileSystem { static func == (lhs: Folder, rhs: Folder) -> Bool { lhs.id == rhs.id && lhs.fileURL == rhs.fileURL } var id: UUID var fileURL: URL var fileName: String var subfolder: [Folder]? } subfolder는 반드시 옵셔널 형태의 배열 더보기…

Swift 예제: AVFAudio와 사운드폰트 파일을 이용해 미디(MIDI) 파일 재생

소개 애플 기본 제공 라이브러리인 AVFAudio를 이용해 미디(확장자 *.mid) 파일을 재생합니다. 사운드폰트(*.sf2)를 이용해 플레이하므로 적절한 사운드폰트가 필요합니다. 오류가 발생하는 사운드폰트가 많으므로 다양하게 테스트하는 것을 권장합니다. 무료 사운드폰트 자료실   절차 1: 프로젝트에 사운드폰트 및 예제 미디파일 추가   2: 뷰모델(conductor) 및 뷰 만들기 (SwiftUI 기준) 이번 예제는 SwiftUI를 사용하지만 MIDIFilePlayConductor만 활용해서 더보기…

Xcode를 이용해 백준 문제를 Swift 언어로 풀기 및 문제 목록 관리 + 값 입력 받는 방법

소개 https://www.acmicpc.net (백준 온라인 평가)에 나와있는 코딩테스트 문제에서 인풋은 어떻게 처리하며, 또 문제 관리를 Xcode로 하는 방법에 대해 설명합니다.   문제 관리 프로젝트 추가 1) Command Line Tool 프로젝트 생성 Xcode 상단에서 File > New > Project… (단축키 command + shift + N)을 누른 뒤 아래 스크린샷과 같이 macOS > 더보기…