SWIFT

51
P_001 · SWIFT

GCD 시리얼 큐로 로그 라이터를 재작성한 이유 — actor + AsyncStream을 버린 결정

actor는 mutual exclusion을 보장하지만 thread identity는 보장하지 않는다. Realm/SwiftData 같은 thread-confined 자원에는 GCD serial queue가 답인 이유.

MAY 13, 2026 · 5 MIN
#swift#concurrency#gcd
P_002 · SWIFT

47개 @Model 중 4개만 보존하기 — default-safe 정책 설계

47개 @Model 중 4개만 보존하고 43개는 삭제하는 정책을 설계하면서 만난 네 가지 후보. 누락이 안전을 깨지 않는 design 원칙: default = 삭제, 정책 = 한 곳, 적용 = 자동화.

MAY 13, 2026 · 3 MIN
#swiftdata#architecture#designpattern
P_003 · SWIFT

SwiftData #Predicate에서 enum 비교가 0건을 반환하는 이유

SwiftData #Predicate가 사용자 정의 enum을 만나면 throw 없이 0건을 반환한다. SQL 번역 실패가 침묵으로 드러나는 함정. raw value 컬럼, Swift filter, PK 인코딩 세 가지 우회법.

MAY 13, 2026 · 4 MIN
#swiftdata#predicate#enum
P_004 · SWIFT

@Model 스캐폴드 id + .unique 제약 = 조용한 데이터 손실

SwiftData에서 sentinel default id(.invalidInt = -1)와 @Attribute(.unique)와 try?가 만나면 100건이 1건으로 줄어든다. 에러 없이. 다층 방어로 막는 법.

MAY 13, 2026 · 3 MIN
#swiftdata#attribute#unique
P_005 · SWIFT

Swift String.hashValue로 DB PK를 만들면 안 되는 이유

Swift의 String.hashValue는 per-process random seed라서 앱 재시작마다 값이 바뀐다. DB PK로 박으면 lookup이 영구 실패한다. 결정적 hash로 가야 하는 이유와 마이그레이션 처리.

MAY 13, 2026 · 3 MIN
#swiftdata#hashable#primarykey
P_006 · SWIFT

Swift 6에서 매일 만나는 변화 7가지 — strict concurrency부터 typed throws까지

Swift 6에서 매일 실무 코드를 만질 때 부딪히는 변경 7가지 정리. strict concurrency 모드, Sendable 강제, typed throws, existential any 강화, migration mode 등.

MAY 13, 2026 · 4 MIN
#swift#swift 6#concurrency
P_007 · SWIFT

Swift mutating인데 self를 안 바꾸는 함수 — 컴파일 통과하는 시그니처의 함정

mutating 키워드는 self 변경 의도를 표현하는 계약이다. 컴파일러는 그 의미를 검증하지 않아서, self를 안 바꾸는 함수에도 mutating이 붙어 통과한다. PR 리뷰에서 만난 실제 사례와 builder 패턴 대안.

MAY 13, 2026 · 4 MIN
#swift#mutating#struct
P_008 · SWIFT

isPush 플래그가 만드는 Coordinator 흐름 분기 지옥

푸시 진입과 일반 진입을 isPush 플래그로 가르는 순간, dismiss 경로가 두 갈래로 갈리고 cascade finish가 의도와 정반대로 동작한다. 분기 자체가 정책과 어긋난 사례.

MAY 13, 2026 · 3 MIN
#coordinator#uikit#navigation