Swift: @dynamicMemberLookup 사용법 및 @Published 와 결합 가능 여부

개요 — @dynamicMemberLookup이란 @dynamicMemberLookup은 **컴파일러에게 “점(.) 접근을 보낼 때 subscript(dynamicMember:)로 재해석해라”**고 지시하는 어노테이션입니다. 즉 obj.foo를 호출하면 컴파일러는 obj[dynamicMember: "foo"] 형태의 서브스크립트 호출로 바꿔줍니다. 주로 내부에 [String: Any] 같은 딕셔너리를 두고 JSON/동적 프로퍼티처럼 보이게 할 때 유용합니다.   간단한 동작 원리 선언: @dynamicMemberLookup을 타입 앞에 붙입니다. 필수: subscript(dynamicMember:) 구현(여러 오버로드 허용). 더보기…

SwiftUI: 목록 행(row) 및 헤더(header) 높이 변경

소개 이 예제는 SwiftUI List에서 행(row)과 헤더(header) 높이를 변경하는 방법을 보여줍니다. 최종 결과는 다음과 같습니다:   설명 defaultMinListRowHeight 라는 EnvironmentValue를 사용해서 기본 최소 행 높이를 설정할 수 있습니다. 마찬가지로 defaultMinListHeaderHeight를 사용하면 섹션 헤더의 높이를 지정할 수 있습니다. 아래 코드는 그룹화된 리스트에서 슬라이더로 두 값을 조절하는 예시입니다: // …SwiftUI View에서 작성… 더보기…

Swift: @retroactive 란?

Retroactive 란? 해당 경고는 Swift에서 retroactive conformance(기존 타입에 프로토콜을 채택시키는 것)를 사용할 때 나타나는 것으로, 나중에 AudioKit 라이브러리 자체에서 NodeParameter에 Hashable을 추가하게 되면 중복 충돌이 발생할 수 있음을 경고합니다. Extension declares a conformance of imported type ‘AVAudioUnitReverbPreset’ to imported protocol ‘CaseIterable’; this will not behave correctly if the owners of 더보기…

Swift: some, any 키워드

Swift의 some과 any 키워드 안녕하세요! 오늘은 Swift의 some과 any 키워드에 대해 실무에서 겪을 수 있는 상황들을 포함해 자세히 알아보겠습니다. 이 두 키워드는 프로토콜을 다룰 때 매우 중요한 역할을 하며, 각각 다른 상황에서 사용됩니다.   키워드 도입 역사 먼저 각 키워드가 언제 도입되었는지 살펴보겠습니다: some 키워드: Swift 5.1에서 도입 any 키워드: 더보기…

macOS 개발: 내 앱으로 파일 열기 시도 시 실행 불가 문제(“확인되지 않은 개발자가 배포함”) 해결 과정

macOS 앱 노터라이즈(Notarize) 및 실행 불가 문제 해결 과정 1. 문제 개요 macOS에서 포스트잇 플레인 텍스트 앱인 StickyPlainPad을 테스트하는 중, 특정 테스트 파일 “다음으로 열기…”를 통해 실행했을 때 다음과 같은 문제가 발생하였습니다. 앱이 열리지 않음 보안 경고 메시지: “Mac에 손상을 입힐 수 있음” 또는 “확인되지 않은 개발자가 배포함” 이 문제는 더보기…

Swift UIKit: 테이블 뷰에서 UITextView의 컨텐츠에 따라 높이 자동조정

참고 Swift(스위프트): Static cell 모드인 테이블 뷰(UITableView)에서 특정 섹션 감추기 + 특정 행의 크기만 조절   구조 및 제약(Constraints)       1) 텍스트 뷰(UITextView)를 선택한 뒤 Indicator > Scroll View > Scrolling Enabled 해제 또는 코드에서 직접 설정합니다. textView.isScrollEnabled = false   2) 해당 인덱스패스 (IndexPath)의 heightForRowAt을 UITableView.automaticDimension으로 설정 더보기…

Swift UIKit: .translatesAutoresizingMaskIntoConstraints 란 무엇인가?

translatesAutoresizingMaskIntoConstraints UIKit에서 아직도 무슨 의미인지 잘 모르겠는 (View).translatesAutoresizingMaskIntoConstraints에 대해 알아보겠습니다.   한국어 직역 translatesAutoresizingMaskIntoConstraints를 한국어로 직역하면 다음과 같습니다: “Autoresizing 마스크를 제약 조건으로 변환한다” 구체적으로 단어별로 나누어보면: translates: 변환한다, 번역한다 AutoresizingMask: 자동 크기 조절 마스크 (UIKit의 레이아웃 시스템에서 뷰의 크기와 위치를 자동 조절하는 속성) into Constraints: 제약 조건으로 따라서 전체 의미는: 더보기…

macOS 앱 포트폴리오: 플레인 텍스트를 작성/관리할 수 있는 포스트잇 앱 (애플 앱스토어 출시 💻)

StickyPlainPad StickyPlainPad는 플레인 텍스트(서식 없는 텍스트)를 포스트잇처럼 맥 여기저기에 붙였다 뗐다 사용할 수 있는 메모 앱입니다. View this post on Instagram A post shared by BGSMM (@bgsmm.dev) 앱스토어 링크 StickyPlainPad 한국 앱 스토어 링크 (모든 국가 출시, 유료)   깃허브 링크 https://github.com/ayaysir/macOS-StickyPlainPad   특징 및 사용 기술 애플 앱스토어의 검수에 통과하였습니다. 더보기…

Swift UIKit: 최상위 Top View Controller (현재 화면의 VC) 찾기 / 예제: SwiftUI에서 빠른 Alert 띄우기

1. UIApplication의 KeyWindow 대체 import UIKit extension UIApplication { var keyWindow: UIWindow? { connectedScenes .compactMap { $0 as? UIWindowScene } .flatMap { $0.windows } .first { $0.isKeyWindow } } } ‘keyWindow’ was deprecated in iOS 13.0: Should not be used for applications that support multiple scenes as it returns a 더보기…