RSS 사용하여 당신의 빵을 사용하세요 - iOS 개발... 노트

노트 스레드

WWDC 2026은 Platforms State of the Union을 시작점으로 하여 Liquid Glass와 Apple Intelligence에 중점을 둡니다. 100개 이상의 세션이 자신의 속도에 맞춰 제공되므로 즉시 모든 것을 배울 필요는 없습니다. 세션 시청은 일반적으로 간결하고 핵심적인 내용을 담고 있으므로 Apple Developer 앱 또는 YouTube를 이용하는 것이 좋습니다. Swift 6.4는 편의성 개선과 FilePath, Swift-C 상호 운용과 같은 새로운 기능을 도입합니다. SwiftUI는 필수적인 Liquid Glass 변경, 최소한의 메뉴 아이콘, 눈에 띄는 탭 역할과 함께 새로운 문서 API 및 재정렬 가능한 컨테이너를 지원합니다. UIKit 앱 현대화는 크기 조절 가능한 환경 및 필수 UIScene 라이프사이클에 적응하는 것을 포함하며, AppKit 앱은 컨트롤 이벤트 및 키보드 탐색을 활용해야 합니다. Xcode 27은 사용자 정의 가능한 도구 모음, 현지화 및 프로토타이핑과 같은 작업을 위한 코딩 에이전트, 개선된 장치 허브를 제공합니다. Instruments는 Swift 실행기 도구 및 에이전트 앱 디버깅을 위한 Foundation Models 도구를 포함한 프로파일링을 위한 새로운 모드를 제공합니다. MetricKit은 앱 성능 메트릭 수집을 위한 Swift 우선 API로 재구축되었습니다. 개발자는 Swift Testing으로 마이그레이션할 수 있으며, Xcode의 코딩 도우미가 이 과정을 지원합니다. Xcode Cloud는 빌드, 배포 및 자동화 워크플로우를 간소화합니다. SwiftData는 섹션별 가져오기 요청 및 Codable 유형 저장 기능과 같은 업데이트를 받았습니다. 디자인 원칙은 목적, 단순성, 명확한 명명 규칙을 강조하며 직관적인 검색 경험을 만드는 방법에 대한 지침을 제공합니다. 접근성 향상에는 앱 읽기를 위한 개선된 VoiceOver 탐색 및 AI 생성 자막이 포함됩니다. Apple Intelligence는 Foundation Models 프레임워크를 확장하여 오픈 소스로 만들고 온디바이스 및 Private Cloud Compute 옵션을 제공합니다.
Git 커밋 시 자동 Swift 코드 서식 지정은 swift-format 도구와 Git pre-commit 훅을 사용하여 구현할 수 있습니다. Xcode 16은 swift-format을 툴체인에 포함하고 있으며, swift format MyFile.swift와 같이 명령줄을 통해 실행할 수 있습니다. swift-format의 구성은 .swift-format 파일을 통해 관리되며, 이 도구는 현재 디렉토리와 상위 디렉토리를 순차적으로 검색합니다. 기본 구성은 swift format dump-configuration을 사용하여 생성하고, 사용자 정의 코드 스타일을 정의하도록 수정하여 원하는 위치에 저장할 수 있습니다. Git 훅은 특정 작업 시 사용자 정의 스크립트를 실행할 수 있게 해주며, pre-commit 훅은 커밋이 완료되기 전에 실행됩니다. 제공된 pre-commit 스크립트는 git diff를 사용하여 스테이징된 Swift 파일(추가, 복사, 수정 또는 이름 변경)을 식별합니다. 그런 다음, 이러한 파일에 대해 swift format --in-place --parallel을 실행하여 직접 수정합니다. 포맷터가 파일을 변경하기 때문에, 스크립트는 이후 git add를 사용하여 새롭게 서식이 지정된 파일을 다시 스테이징하여 커밋합니다. 이 pre-commit 스크립트는 각 저장소의 .git/hooks 디렉토리에 복사하고 실행 가능하게 만들어야 합니다. 이는 클라이언트 측 훅이므로, 모든 새 저장소 또는 복제된 저장소에 대해 설치가 필요합니다. git commit --no-verify 명령을 사용하여 pre-commit 검사를 우회할 수 있습니다.
CdXz5zHNQW_5ZPzFJEMHm.png
Swift 6.2는 Observable 타입의 상태 변경을 스트리밍하는 새로운 Observations 타입을 도입합니다. 이는 장면의 검색 쿼리 및 탐색 경로와 같은 애플리케이션 상태를 유지하는 데 유용합니다. 저자는 이전에 이 상태를 Codable 클래스인 SceneModel에서 관리했으며, 이를 JSON으로 인코딩하여 유지할 수 있었습니다.SceneModel은 루트 뷰의 @SceneStorage를 사용하여 저장 및 복원되었습니다. 그러나 상태 저장은 scenePhase를 모니터링하는 데 의존했는데, 이는 장면이 백그라운드로 전환되기 전에 종료될 수 있기 때문에 신뢰할 수 없었습니다. Swift 6.2 이전에는 @Published 속성을 가진 ObservableObject를 사용하여 Combine의 buffervalues를 활용해 상태 변경을 저장하기 위한 AsyncSequence를 생성할 수 있었습니다.iOS 26 및 Swift 6.2와 함께 Observations 타입은 Observable 타입에 대한 유사한 AsyncSequence를 제공합니다. 이를 통해 SceneModel의 JSON 표현과 같은 계산된 속성을 관찰할 수 있습니다. Observations 타입은 관찰될 값을 반환하는 클로저를 사용합니다.변경 사항은 트랜잭션적이어서, 관찰 가능한 속성에 대한 여러 동기식 업데이트가 단일 시퀀스 값으로 일괄 처리됩니다. 업데이트 추적은 관찰 가능한 속성의 willSet으로 시작하여 다음 일시 중단 지점에서 완료됩니다. 이를 통해 scenePhase에 의존하지 않고 장면 모델의 상태가 변경될 때마다 자동으로 저장할 수 있습니다. Observations의 AsyncSequence는 구독 시 관찰된 속성의 초기 값을 방출합니다.
CdXz5zHNQW_BQHW5Oy3tB.png
CdXz5zHNQW_9KktMjMyKW.png
CdXz5zHNQW_StQr2PuKiZ.png
이 글은 SwiftUI의 Button과 Label 스타일을 사용자 정의하는 방법을 설명합니다. 여기에는 컴팩트한 가로 크기 클래스에서는 세로 레이아웃으로 전환되는 적응형 레이블 스타일과 채워진 노란색 캡슐과 고정폭 글꼴 디자인을 가진 사용자 지정 캡슐 버튼 스타일이 포함됩니다. 이러한 스타일은 .labelStyle.buttonStyle 수정자를 사용하여 뷰에 적용할 수 있습니다. 하지만 LabelStyle이나 ButtonStyle에 편의성 확장을 추가하는 것은 덜 일반적인데, 이를 통해 수정자를 더욱 간결하게 작성할 수 있습니다. 이를 위해 이 글에서는 Apple이 기본 스타일을 정의하는 방식과 유사하게 ButtonStyle과 LabelStyle을 확장하는 것을 제안합니다. 여기에는 사용자 지정 스타일의 인스턴스를 반환하는 정적 속성이나 함수를 확장에 추가하는 것이 포함됩니다. 예를 들어, 캡슐 버튼 스타일은 CapsuleButtonStyle 인스턴스를 반환하는 정적 속성 capsule로 확장할 수 있습니다. 이를 통해 .buttonStyle(.capsule)과 같은 간결한 형태로 스타일을 적용할 수 있습니다. 사용자 지정 스타일에 구성 가능한 색상과 같은 매개변수가 있는 경우, 매개변수를 받아 사용자 지정 스타일의 인스턴스를 반환하는 함수를 확장에 추가할 수 있습니다. 이를 통해 .buttonStyle(.capsule(.orange))과 같이 매개변수와 함께 스타일을 적용할 수 있습니다. 이 글에서는 편리한 사용자 지정 스타일을 만들기 위해 ButtonStyle과 LabelStyle을 확장하는 방법의 예시를 제공합니다.
SwiftUI로 언어 학습 앱을 만들 때, VoiceOver가 기기의 로케일과 다른 언어로 된 텍스트를 정확하게 발음하지 못할 수 있습니다. 이 문제를 해결하려면 VoiceOver에서 사용하는 접근성 언어를 변경해야 합니다. UIKit에서는 텍스트 레이블의 accessibilityLanguage 속성을 설정할 수 있지만, SwiftUI에서는 사용할 수 없습니다. 한 가지 제안된 해결책은 accessibilitySpeechLanguage 속성이 있는 AttributedString을 사용하는 것이지만, 작동하지 않습니다. 또 다른 해결책은 environment modifier를 사용하여 각 뷰의 로케일 환경을 변경하는 것입니다. 그러나 이는 Text 뷰에 verbatim 이니셜라이저를 사용하는 경우에만 작동합니다. 왜냐하면 기본적으로 텍스트를 지역화된 문자열 키로 취급하기 때문입니다. 이 해결책은 Text 뷰에서는 작동하지만, Label과 같은 뷰에서는 더 긴 형식이 필요합니다. 레이블 또는 자식 텍스트 뷰에 로케일을 적용할 수 있지만, 아이콘이 있는 Label을 사용하는 경우, Button에 적용해야만 로케일이 적용됩니다. 이는 VoiceOver가 "button"이라는 단어를 수정된 로케일로 발음하지만, 메인 텍스트는 올바르게 발음된다는 의미입니다. 결론적으로, SwiftUI에서 VoiceOver가 사용하는 접근성 언어를 변경하려면 각 뷰의 로케일 환경을 변경하는 것이 해결책입니다.
이 기사는 SwiftUI에서 스크롤 뷰 내 콘텐츠의 수직 정렬을 관리하는 방법, 특히 동적 타입 크기에 적응할 때의 방법을 논의합니다. 처음에는 화면 높이를 초과할 수 있는 콘텐츠를 수용하기 위해 간단한 스크롤 뷰가 사용됩니다. 하지만 이로 인해 콘텐츠가 스크롤 뷰보다 작을 때 콘텐츠가 상단에 정렬되는 바람직하지 않은 결과가 발생합니다. iOS 17에서는 defaultScrollAnchor 수정자가 도입되었지만, 스크롤 뷰 내에 콘텐츠가 들어갈 때만 중앙에 배치하는 섬세함이 부족합니다. iOS 18은 role 매개변수를 포함하는 새로운 defaultScrollAnchor 수정자를 통해 이 문제를 해결합니다. 이 매개변수를 통해 개발자는 .alignment를 사용하여 컨테이너보다 작은 콘텐츠를 정렬하는 것을 포함하여 다양한 상황에 대한 앵커 포인트를 사용자 정의할 수 있습니다. .alignment 역할에 대해 앵커를 .center로 설정하면 콘텐츠가 들어갈 때는 중앙에 배치되고 컨테이너 높이를 초과할 때는 상단에 정렬됩니다. 두 가지 변형의 뷰 수정자를 함께 사용하여 기본값을 변경하고 특정 역할에 대한 앵커를 재정의할 수 있습니다. 새로운 수정자는 컨테이너에 대한 크기에 따라 스크롤 뷰 콘텐츠 정렬을 관리하는 보다 정교한 접근 방식을 제공합니다. 이는 콘텐츠의 수직 위치를 동적으로 조정하여 더 나은 사용자 경험을 보장합니다.
CdXz5zHNQW_YDEZMZMpGv.png
CdXz5zHNQW_jArWhqLPsY.png
사용자가 버튼을 누를 때 SwiftUI 버튼이 표시하는 이미지를 변경하려면 기본 상태와 눌린 상태에 대한 두 개의 이미지를 허용하는 제목과 함께 사용자 지정 버튼 스타일을 생성할 수 있습니다. 이 사용자 지정 스타일은 ButtonStyle 프로토콜에 따라 구현되는 구조체를 생성하여 달성할 수 있습니다. ButtonStyleConfiguration에서는 버튼 레이블, isPressed 상태 및 버튼 역할에 액세스할 수 있으며, 표시할 이미지를 결정하는 데 사용할 수 있습니다. makeBody 메서드에서는 버튼 구성에 따라 isPressed 상태에 따라 올바른 이미지를 표시하는 레이블을 반환할 수 있습니다. 그런 다음 이 사용자 지정 스타일을 사용하여 특정 유형의 버튼, 예를 들어 InfoButton을 구축할 수 있습니다. 이 InfoButton은 눌렸을 때 수행할 액션과 함께 호출할 수 있습니다. 또한 눌렸을 때 이미지를 확대하는 애니메이션을 추가하여 symbolEffect 수정자를 사용할 수도 있습니다. 이 접근 방식으로 UIKit의 버튼 상태 구성과 유사한 효과를 SwiftUI에서 달성할 수 있습니다. 사용자 지정 버튼 스타일은 앱의 다른 버튼에 재사용할 수 있는 편리한 솔루션입니다. 전반적으로, SwiftUI 버튼의 모양을 사용자 지정하려면 사용자 지정 버튼 스타일을 생성하는 것이 좋은 방법입니다. 특히 기본 스타일이 요구 사항을 충족하지 않을 때입니다.
애플의 인간 인터페이스 가이드는 목적 없이 사용자 인터페이스에 애니메이션을 추가하는 것을 권장하지 않습니다. 이는 사용자에게 방해가 되고 불편할 수 있기 때문입니다. 애니메이션은 선택 사항이어야 하며 중요한 정보를 전달하는 유일한 방법이 되어서는 안 됩니다. 진동 애니메이션과 같은 특정 유형의 애니메이션은 사용자에게 문제가 될 수 있습니다. 사용자는 장치의 접근성 설정에서 애니메이션을 줄일 수 있으며, 이는 표준 뷰 전환에 영향을 줄 수 있습니다. 그러나 사용자 지정 애니메이션의 경우 개발자가 직접 문제가 되는 애니메이션을 비활성화하거나 대체해야 합니다. 애니메이션 감소를 위한 설정은 SwiftUI 뷰에서 @Environment 속성을 사용하여 감지할 수 있습니다. 문서에서는 애니메이션 감소 설정이 활성화된 경우 3차원 효과를 시뮬레이션하는 큰 애니메이션을 피하는 것을 권장합니다. 애니메이션을 비활성화하려면 개발자는 애니메이션 감소 상태를 고려하여 계산된 속성을 만들 수 있습니다. 이는 애니메이션 감소 설정이 활성화된 경우 애니메이션에 null을 반환하여 애니메이션을 비활성화하는 방식으로 수행할 수 있습니다. 개발자는 자신의 애니메이션에 대해 애니메이션 감소 설정에 반응하는 방법과 시기를 결정해야 합니다.
CdXz5zHNQW_8fvTYjYZBQ.png
애플이 WWDC24에서 @Test 매크로의 arguments 매개 변수를 사용하여 테스트 함수에 인수를 전달할 수 있는 Swift Testing을 소개했습니다. 이 기능은 매개 변수화된 테스트를 가능하게 합니다. 매개 변수화된 테스트에서는 각 값마다 arguments 컬렉션에서 테스트 함수가 한 번 호출됩니다. Test Navigator에는 각 테스트 실행 결과가 표시됩니다. 인수가 두 개 전달되면 Swift Testing은 두 인수의 모든 조합에 대한 테스트 케이스를 생성합니다. 그러나 인수는 최대 두 개로 제한되며 모든 조합이 필요하지 않은 경우 인수를 zip하여 짝을 지을 수 있습니다. 이 기능은 동일한 결과가 예상되는 입력 인수 컬렉션을 테스트할 때 유용합니다. 특히 CaseIterable 열거형을 사용하여 테스트를 구동할 때 특히 편리할 수 있습니다. 저자는 이 기능을 XCTest 기반 유닛 테스트를 Swift Testing으로 마이그레이션할 때 유용하게 사용할 수 있었는데, 특히 Core Data 관리 객체 클래스의 속성을 확인할 때 그렇습니다. Swift Testing 접근 방식은 병렬로 실행될 수 있는 독립적인 테스트 케이스와 더 명확한 실패 보고를 포함하여 for 루프를 사용하는 것보다 여러 가지 이점이 있습니다. 전반적으로 Swift Testing에서의 매개 변수화된 테스트는 테스트를 단순화하고 결합할 수 있으므로 실제로 유용한 기능입니다.
스위프트 테스팅은 애플이 WWDC24에서 소개하고 Xcode 16에 포함된 스위프트용 오픈 소스 테스팅 프레임워크입니다. 이 프레임워크는 동시성과 매크로 gibi 현대적인 기능을 사용하며, 애플 플랫폼 외에도 윈도우와 리눅스를 지원합니다. XCTest에서 마이그레이션할 필요는 없지만, 스위프트 테스팅은 스위프트 동시성을 사용하여 프로세스 내에서 테스트를 실행할 수 있는 기능을 포함하여 몇 가지 이점을 제공합니다. 이는 물리적 장치에서 병렬 테스팅을 허용합니다.스위프트 테스팅을 시작하려면 테스트 대상에서 XCTest와 스위프트 테스팅 유닛 테스트를 혼합할 수 있지만, 테스트 내에서 테스팅 프레임워크를 혼합해서는 안 됩니다. 테스트 파일에 "import Testing"을 추가하여 스위프트 테스팅 프레임워크를 가져올 수 있습니다. 애플은 테스트를 그룹화하고, 구조체 또는 클래스에 추가하여 init 메서드를 사용하여 설정 및 해제하는 것을 권장합니다.스위프트 테스팅 테스트는 @Test 매크로를 추가하여 유닛 테스트가 되는 일반적인 스위프트 메서드입니다. 테스트 메서드를 async 또는 throws로 표시하고, 필요한 경우 액터로 분리할 수 있습니다. @Test 속성은 구현을 볼 수 있도록 확장할 수 있는 매크로입니다.스위프트 테스팅은 #expect 및 #require 매크로를 사용하여 AssertionError를 제공하며, 이는 XCTest의 XCTAssert보다 더 유연하고 정보가 풍부한 오류 메시지를 제공합니다. #expect 매크로는 실패한 기대를 로깅하고 테스트를 계속하고, #require 매크로는 오류가 발생하면 테스트 실행을 중지하는 throwing 버전입니다.또한 Issue.record를 사용하여 조건을 평가하지 않고 테스트를 실패시키는 것이 가능합니다. 이는 XCTest의 XCTFail과 유사합니다. 전반적으로, 스위프트 테스팅은 개선된 동시성 지원 및 더 유연한 AssertionError를 포함하여 XCTest보다 몇 가지 이점을 제공합니다.
iOS 18에서 UIKit는 자동 트레이트 추적을 도입하여 레이아웃 업데이트에 대한 메소드에서 트레이트 변경 알림을 수동으로 등록할 필요를 제거했습니다. 이 기능은 UIView의 layoutSubviews, updatesConstraints, draw와 같은 다양한 뷰 및 뷰 컨트롤러 메소드에서 지원되며, UIViewController의 viewWillLayoutSubviews 및 updateViewConstraints도 포함됩니다. UIKit가 이러한 메소드 중 하나를 호출할 때, 액세스된 트레이트를 기록하고 해당 트레이트가 변경되면 뷰를 자동으로 무효화합니다. 이는 setNeedsLayout, setNeedsUpdateConstraints, setNeedsDisplay 또는 setNeedsUpdateConfiguration와 같은 메소드를 사용하여 수행됩니다. 예를 들어, draw를 재정의하는 UIView 하위 클래스에서 preferredContentSizeCategory 트레이트에 액세스하면 트레이트가 변경될 때 자동으로 setNeedsDisplay를 호출합니다. iOS 18 이전에는 개발자가 트레이트 변경을 수동으로 등록하고 setNeedsDisplay를 호출하여 draw를 다시 호출해야 했습니다. 그러나 자동 트레이트 추적을 사용하면 이 프로세스는 UIKit에 의해 처리됩니다. 이 기능은 트레이트 변경에 응답하는 프로세스를 단순화하고 필요한 코드의 양을 줄입니다. 자동 트레이트 추적은 iOS 18에서 중요한 개선으로, 개발자가 적응형 및 반응형 사용자 인터페이스를 만들기 더 쉽게 해줍니다.