WWDC2022: Platforms State of the Union
(6월 7일 작성)
새벽 2시부터 일어나서 keynote랑 platforms state of the union를 챙겨봤다. 난 촌놈마냥 각각의 신기능들에 흥분하면서 가슴이 막 벅차올랐는데, 다른 사람들은 그렇지 않았나보다. 하드웨어가 더 이목을 끌기 좋다는 건 이해하지만(맥북 에어 가격이 모든 어그로를 다 가져갔다), keynote에 비해 platforms state of the union은 언급조차 없다는게 조금 아쉬웠다. 아니... 좀 많이 아쉽다. 저기요? 정규 표현식을 선언적 구문으로 사용할 수 있어요! SwiftUI에 그리드도 생겼고요, 차트도 만들 수 있고요, 또.. 음... 웹 매뉴얼 UI가 리뉴얼됐어요!(충격)
사실 이번 WWDC에서 가장 마음에 들었던 업데이트였다. 좌측에 사이드바가 생겨 목차를 토글 목록으로 조회할 수 있게 되었고, 자체 검색바도 생겼으며, 전반적으로 깔끔해졌다.
이번 WWDC에 전반적으로 어떤 사항들이 있는지 훑어보고 이해한다면 이후에 원하는 내용을 찾아 본격적으로 공부해보려 할 때 도움이 될 것이다.
오늘(6/7 기준) 정식 런칭(베타 딱지 뗌)
가격:
하반기에는 Developer 앱에서도 Xcode Cloud 구독 사항을 관리할 수 있도록 할 예정.
// 동기 구문
for (number, letter) in zip(numbers, letters) {
print(number, letter)
}
// 비동기 구문
for await (number, letter) in zip(numbers, letters) {
print(number, letter)
} // 서로 비슷한 구문처럼 보이지만 내부 처리 메커니즘은 전혀 다르다.
fastEvents.throttle(for .seconds(1)) // 인자로 clock 타입을 사용
클라이언트의 트래픽을 수락하고 서버로 라우팅하는 독립 실행형 프로세스.
서로 통신하는 방법을 알고 있는 클라이언트 및 서버 측 프로세스 필요.
인터넷 검열 주체가 송수신 정보를 알 수 없도록 트래픽 자체를 난독화하는 것을 목표로 한다.
출처: https://obfuscation.github.io
정규 표현식은 문자열 정보 추출 코드의 가독성•편의성을 높여주는 표현식이다.
let regexString : Regex = /Order from (.*), count: ([0-9]+)/
// Regex 타입은 정규 표현식이 포함된 문자열을 저장한다.
// RegexBuilder는 선언적 구문을 정규 표현식으로 변환한다.
let logRegex = Regex {
OneOrMore(.whitespace)
Capture {
"0x"
OneOrMore {
CharacterClass(
.anyOf("_."),
("a"..."z"),
("A"..."Z")
)
}
}
OneOrMore(.whitespace)
Capture {
...
}
}
struct MusicLibrary {
var playlists: [any Collection<Song>]
// any 키워드로 실존 타입임을 명시할 수 있다.
// Swift 6부터는 any 키워드가 없는 실존 타입은 에러를 발생시킨다.
func playAll() {
for playlist in playlists {
playSongs(in: playlist)
}
}
}
// 실존 타입 인자는 구체적 타입 정보가 없으므로 타입 캐스팅이 필요하다는 단점이 있다.
func playSongs(in playlist: any Collection<Song>)
// Generic 함수로 playlists 인자를 받으려 한다.
// 1. 제네릭 개선 이전 : Generic 및 타입 제약조건 때문에 가독성이 떨어진다.
func playSongs<Playlist>(in playlist: Playlist)
where Playlist: Collection, Playlist.Element == Song {...}
// 2. 제네릭 개선 이후 : Song을 요소로 가지는 불투명 타입. 기존의 Generic 코드를 대체한다.
func playSongs(in playlist: some Collection<Song>) {...}
기존 NavigationView는 Deprecated되었다.
다음 두 View가 NavigationView를 대체한다.
그외에도 많은 View 및 modifier들이 추가되거나 Deprecated되었다.
그리드 API 추가
Custom Layout API 추가
하프 시트 추가(네이버 지도의 하단부 확장 시트를 떠올리면 된다)
공유 시트 지원: 새로 추가된 Transferable 프로토콜 기반이다.
Transferable 프로토콜: 앱 데이터 전송을 위한 type-safe API이다. 구현한 View는 앱 내외로 드래그&드롭 가능한 데이터가 된다.
UIKit에서 다음 컬렉션 View Cell을 사용하면 SwiftUI View의 선언적 구문을 사용할 수 있다.
cell.contentConfiguration = UIHostingConfiguration {
VStack(alignment: .leading) {
Text(song.title)
Text(song.artist.name)
.font(.caption)
.foregroundStyle(.secondary)
}
}
잠금화면 위젯은 애플 워치의 컴플리케이션을 확장한 것으로, 3종류를 지원한다.
WidgetKit은 애플 워치의 컴플리케이션과 잠금화면 위젯을 동일한 코드 베이스로 사용할 수 있도록 지원한다.
Messages Collaboration API
Siri 및 단축어 기능을 앱 내에서 기본 제공하는 프레임워크
App Intents 프레임워크는 SiriKit의 다음 단계
IntentDefinition 파일에서 convert 버튼을 누르면 App Intents 프레임워크로 업그레이드된다.
사용자가 직접 만들고 입력하는 비밀번호 대신 기기에서 생성한 인증키로 대체하여 보안을 강화한다는 개념이다.
맥에서만 사용 가능하던 DriverKit를 iPad에서도 사용 가능.
애플tv에서 컨트롤러로 사용할 애플 기기를 자동으로 찾아 연결해주고, 해당 앱이 깔려있지 않은 경우 설치할지 물어보는 알림창을 보냄.
SKAdNetwort 개선
앱 내에서 LiDAR 센서를 사용해 주변을 스캔하고, 3D 매개변수 룸 모델을 USD 또는 USDZ 포맷 파일로 만들 수 있게 해준다.
App Intents 프레임워크에서 Focus Filter API 제공
앱 내에 지도를 임베디드할 때 3d 에셋 및 정보를 불러올 수 있음.
WeatherService 객체의 weather함수(지역 인자)로 날씨를 요청.
애플 개발자 프로그램 구독자는 매달 50만건 호출 무료.
예시)
내려갈수록 점점 대충 쓴 것 같다면... 맞다. 갑자기 수면 패턴을 뒤집고, 새벽 2시부터 키노트를 시청하고, ... 저녁까지 쭉 깨어있었더니 정신이 반쯤 나가버렸다. 내가 흥미를 느꼈던 부분이 정규 표현식과 swiftUI 정도뿐인 것도 있다. 그래도 한번 시작한건 끝을 내야지! 하는 생각에 어떻게든 정리해낸 것 같다. 엉망이라는 건 알지만, 이런 정리글이라도 만들었다는 것에 의미를 두자.
사실 이렇게 글을 업로드까지 할거라는 생각은 안했는데, 이도저도 아닌 상태로 시간 끌어봐야 나한테 득 될게 없다, 작성한 글이라도 좀 꾸준히 올려보자-라는 생각에 시작하게 되었다. 올리다보면 나 자신도 뭔가 깨닫는게 있겠지.