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 > 더보기…

Swift+AudioKit: SF2 형식의 사운드폰트 추가

소개 AudioKit에서 sf2 확장자 형식의 MIDI 사운드폰트를 프로젝트에 추가하고 연결하는 방법입니다. Swift(스위프트): 오디오 라이브러리 AudioKit 프레임워크 소개   방법 1) Capabilities > Background Modes에서 Audio 추가   2) 사운드폰트 파일을 프로젝트 내에 추가   3) 사운드 컨덕터(ObservableObject) 생성 class InstrumentSFZConductor: ObservableObject, HasAudioEngine { let engine = AudioEngine() var instrument = 더보기…

Swift: Combine 개요

개요 Combine 프레임워크는 시간 경과에 따라 값을 처리하기 위한 선언적(declarative)인 명령을 제공하는 Swift의 API입니다. 이러한 값은 다양한 종류의 비동기 이벤트(asynchronous event)를 나타낼 수 있습니다.   Publisher와 Subscriber Publisher(공표자, 게시자): 시간이 지남에 따라 일련의 값을 전달할 수 있는 타입이라는 것을 선언하는 프로토콜 operator: 상류에서 흐르는 퍼블리셔(upstream publisher)로부터 받은 값으로 특정 작업을을 더보기…

SwiftUI 예제: 아이폰 손전등(Flashlight) 만들기 (카메라 플래시 + 화면 밝기 강제 조정 및 복구)

소개 아이폰 손전등에는 다음 3가지 기능이 필요합니다. 아이폰 후면 카메라에 달려있는 플래시(Swift에서는 torch라고 함)의 밝기 조절 (옵션) 디스플레이 전면의 화면 밝기 조정 (옵션) scenePhase를 통한 백그라운드 시 화면 밝기 원래대로 돌려놓기   모든 기능은 실제 아이폰 기기에서만 실행할 수 있습니다. 참고) 손전등 앱(정확히 말하면 손전등 기능만 있는 앱)은 최신 앱 스토어 더보기…

SwitfUI: LazyVGrid의 GridItem…flexible()을 사용할 때 각 셀 간의 여백을 일정하게 지정하는 방법

요약 세로 간의 여백은 LazyVGrid의 spacing 파라미터에서 지정합니다. 가로 간의 여백은 GridItem의 spacing에서 지정합니다. 이미지(Imaage)가 셀을 구성하는 경우, 반드시 .resizable()을 추가해야 이미지 크기가 컬럼 크기에 맞게 조정됩니다.   코드 import SwiftUI struct AlbumListView: View { let MARGIN: CGFloat = 10 @State private var columnCount = 3.0 // 화면을 그리드형식으로 꽉채워줌 더보기…