2026-06-17 (수)
✅ 학습 완료
- some vs any 심화 — Opaque Type vs Existential
some: 컴파일러가 구체 타입 앎, Static Dispatch, 하나의 타입만
any: 런타임에 타입 결정, Dynamic Dispatch (PWT), 여러 타입 가능
- PAT는
-> Sequence 직접 사용 불가 → some 또는 any 필수
some: Swift 5.1 도입 / any + PAT: Swift 5.7 도입
- 📄 Closure Capture 완벽 가이드 — 캡쳐 메커니즘, 메모리 구조
- 기본 캡쳐 = 변수 참조 (Class든 Struct든)
- Capture List: Struct
[def] → 값 복사 / Class [abc] → 레퍼런스 복사
- Class 값 복사:
[copiedT = abc.t] 필요
- 클로저 = 레퍼런스 타입, 힙에 저장, Code Pointer → Code Segment
- 📄 Tuist Q&A — MD → HTML 변환, 프로젝트명 일반화
💡 핵심
some 쓰는 이유:
- 복잡한 타입 숨기기 (
LazyMapSequence<...> → some Sequence)
- 내부 구현 변경해도 API 시그니처 유지
- Static Dispatch 성능 유지
- SwiftUI
var body: some View
Existential이란:
- "프로토콜을 타입처럼 쓰는 것" = Existential Type
- Existential Container = Value Buffer + Type Metadata + PWT
some = 투명 상자 (컴파일러가 앎) / any = 불투명 상자 (런타임에 열어봄)
📕 오답노트
some은 "여러 타입에 대해 사용"하는 게 아니다
- ❌ 틀린 정의: "호출자가 여러 conform 타입에 대해 사용할 때"
- ✅ 맞는 정의:
some은 항상 같은 하나의 구체 타입만 반환
- 여러 타입 반환하려면
any 사용
// some: 항상 같은 타입
func make() -> some Numeric { return 42 } // 항상 Int
// any: 여러 타입 가능
func make(flag: Bool) -> any Numeric {
flag ? 42 : 3.14 // Int 또는 Double
}
Swift 5.7 이하에서 any + PAT 가능했나?
- ❌ 아니다. 5.7 이상에서 가능해짐
- 5.6 이하:
any Sequence 불가능 → Generic으로만 사용
- 5.7+:
any Sequence 가능해짐
Generic은 같은 모듈이면 인라인, 다른 모듈이면 PWT 전달?
- 거의 맞음. 단, "PWT를 구현체에" → "PWT를 제네릭 함수에" 전달
- 같은 모듈: Specialization → 타입 전용 함수 생성 → 인라인 가능
- 다른 모듈: 본문 안 보임 → PWT를 제네릭 함수에 전달
- 둘 다 컴파일타임에 T 결정됨 (any와 다른 점)
같은 모듈:
f(Dog()) → f_Dog() 생성 (Specialization) → 인라인
다른 모듈:
f(Dog()) → f<T>() + Dog의 PWT 전달 → 테이블 조회
둘 다 컴파일타임에 T=Dog 확정
[Shape]만 쓰면 안 돼? any 없이?
- Swift 5.6 이하:
[Shape] OK (암묵적 existential)
- Swift 5.7+:
[any Shape] 필수 (명시적)
any 키워드: 5.6에서 도입 → 5.7에서 필수화
Struct 캡쳐하면 값이 복사될까?
- ❌ 아니다. Struct도 기본적으로 참조 캡쳐된다
- 변수가 Box에 담겨 힙으로 이동 → 외부 변경 시 클로저에서도 변경된 값 보임
- 값 복사 원하면: Capture List
{ [def] in ... } 사용
struct DEF { var t = 12 }
var def = DEF()
// ❌ 참조 캡쳐 (기본)
let c1 = { print(def.t) }
def.t = 100
c1() // 100
// ✅ 값 캡쳐
var def2 = DEF()
let c2 = { [def2] in print(def2.t) }
def2.t = 100
c2() // 12 (복사됨)
Class를 Capture List로 캡쳐하면 값 복사?
- ❌ 아니다.
[abc]는 레퍼런스만 복사됨
- Class는 본질적으로 레퍼런스 타입
- 값 복사 원하면:
[copiedT = abc.t] 또는 새 인스턴스 생성
2026-06-19 (금)
📖 현재 뷰 레이아웃 전체 과정 심화 정독·복습 중
✅ 학습 완료
- 📄 뷰 레이아웃 전체 과정 심화 — 복습 (세부 6문답)
- a2 frame 변경 = Auto Layout 제약/intrinsic size 변화 → 상위까지 무효화
- 런루프 = 메인 스레드 무한 루프, 이벤트 없으면 sleep(대기). commit은 BeforeWaiting 직전
- setNeedsUpdateConstraints=예약 / updateConstraints=다음 ① 패스에서 시스템이 호출(즉시 X)
- ① update=bottom-up, ② layout=top-down
- X.layoutSubviews() = X의 자식들 frame을 정함 (X 자신 frame은 부모가 정함)
- a2 내부 배치만 무효화면 a2.layoutSubviews만 돌고 viewDidLayoutSubviews 안 불릴 수 있음
📕 오답노트
a1.layoutSubviews()는 a1의 frame을 정하는 것?
- 아니다. "subviews를 layout" → a1이 자식 a2의 frame을 정함. a1 자신 frame은 부모(VC.view)가 정함
- layoutSubviews = frame set까지만. draw·GPU render는 그 이후 별도 단계
2026-06-20 (토)
📖 뷰 레이아웃 전체 과정 심화 복습 중 — 오늘 "6. 실무 함정 체크"까지 읽음
✅ 학습 완료
- 📄 복습노트 — 세부 문답 다수 추가(Q10~Q18)
- 패스 타이밍/순차/render server 합성 위치, backgroundColor 색칠=합성
- updateConstraints→layoutSubviews 자동, intrinsic vs frame 크기(요청→확정)
- setNeeds 자동 트리거 시점, 레이아웃 패스 "여러 번"=사이클 반복
- 위치만 변경=constant라 ② layout만, 제약 애니메이션 패턴 원리
- 레이아웃 설정 방법 전체 리스트(Manual/Autoresizing/AutoLayout/SwiftUI)
- 📄 Generic Specialization 한 바퀴 (POP 복습, 7문답)
- 모듈 경계: generic은 specialize 막힘(일반 함수는 inline만 막힘, 추상화 비용 0)
- PWT 조회의 진짜 비용 = 인라인 불가→최적화 막힘 + address-only
- 값·메타데이터·PWT 전부 "주소"로 전달 = address-only(T 크기 모름)
- 모듈 3시나리오(같은 모듈/다른 모듈/+@inlinable), 컴파일타임 vs 런타임에 T 앎
- 컴파일=실행 아님(치환·생성), specialize 안 하면 witness table 동적 디스패치
- 📄 컴파일·링킹·심볼·static/dynamic·중복 (신규)
- 심볼=mangled name 이름표, 이름은 컴파일·주소는 링킹(static)/런타임(dynamic)
- static=앱 바이너리에 복사 / dynamic=.app/Frameworks 별도 파일+dyld
- 링커 on-demand pull: 정의 1개+참조 N개=정상, 정의 2개=duplicate
- 의존(참조) vs 품기(embed) 차이, import만 하면 lazy로 안 끌려옴(-force_load 예외)
- duplicate symbol=빌드타임(같은 바이너리) vs 런타임 경고(dynamic 분리)·전역상태 불일치
- 📄 Generic 추가 — 메타데이터·인스턴스엔 타입정보 없음(PWT 필요 이유)
- 📄 Tuist — SPM 통합·캐싱(로컬/원격)·증분빌드 vs 바이너리캐시·CI