Xcode

Xcode 15 톺아보기

Zedd0202 2023. 6. 11. 19:56
반응형

안녕하세요 :) Zedd입니다.

오늘은 Xcode 15를 간단히 살펴보려고 합니다. (쓸 날은 멀었지만 ㅎㅎ..)

 

[읽기전에 참고] 

- 아직 정식 릴리스가 아닌 베타

- New feature 위주로 볼건데, 안보는 내용도 있을 수 있음 

- 내 맘대로 좀 쉽게 풀어서 쓰는것도 있을것 같음

 

# 용량

출처: https://twitter.com/sarunw/status/1665969701019865088

용량이 50% 작아졌다고 했는데 진짜 그런듯;;

 

# 인터페이스

이건 그냥 내가 넣고싶어서 ㅎ.. 더 이뻐진게 기특해서 넣음 

 

# 북마크 기능 

1. 특정 파일 자체를 북마크

2. 특정 파일의 특정 라인을 북마크 

둘 다 가능.

Project Navigator에서 파일 > 우클릭하면 북마크 기능을 볼 수 있다. 

파일 자체를 북마크하거나, 현재 해당 파일에 커서가 있는 라인이 자동으로 나옴 

코드 소스 내에서도 당연히 북마크 가능!

어디에서나 우클릭하면 된다. 

북마크한 파일들은 'Bookmark Navigator'에서 볼 수 있다. 

으음

 

# Apple Clang Compiler

- 애플 플랫폼에서 C++ 지원을 위한 페이지 생김 (https://developer.apple.com/xcode/cpp/

- Clang과 빌드 시스템은 빌드 성능, 안정성, 정확성을 개선하는 "explicit modules"라는 모듈 종속성을 빌드하는 새로운 모드를 지원

 

# Asset Catalogs

- Xcode는 에셋 카탈로그의 각 Color와 Image에 대해 Swift / Objc 심볼을 생성

이건 그냥 눈으로 보는게 빠를듯

Color / Image를 넣으면 알아서 심볼을 만들어줘서

resource 파라미터가 있는 이니셜라이저로 바로 접근이 가능.

(나는 zedd_white로 만들었지만 자동으로 카멜로 바꿔주는 듯 하다?)

만약 리소스 이름을 바꾸면 심볼도 달라지기 때문에 

컴파일 에러가 나게 된다. 

이름 변경 및 오타에 탄력적으로(resilient) 대응 + 컴파일러 타입 검사 + 코드 completion = 보다 안정하고 보조적인 에셋 참조 방법 

으음~~

 

# Build System

- 이제 아카이브 빌드는 다른 빌드 작업과 동일한 컴파일 최적화 set을 지원하여 빌드 성능을 개선 (원래는 아니었군..;;)

- 이제 Xcode는 프로젝트의 Dynamic Library 및 프레임워크에 대한 중간 텍스트 기반 Dynamic Library(TBD) 파일을 자동으로 생성

👉 이러한 Stub을 사용하면 링커 종속성을 더 정확하게 추적 가능

👉  export된 심볼 집합을 변경하지 않는 변경사항은 더이상 모든 transitive dependencies(전이 종속성?;;)을 다시 링크할 필요가 없으므로 증분 빌드 속도가 빨라짐

대충 증분 빌드 속도가 빨라진것으로 이해 완료;;

- 이제 Xcode는 Swift Package에 정의된 매크로 빌드 및 사용을 지원함

- 비트 코드 지원이 제거되었으며 ENABLE_BITCODE 빌드 설정이 더 이상 적용되지 않음 

 

# Console

- 콘솔에 os_log를 스트리밍함 

예전에 os_log 글을 쓴 적이 있었는데.. 내가 쏜 os_log들을 볼려면

이렇게 콘솔앱을 따로 열어서 확인이 가능했음. 

이것이 Xcode console에 통합된다고 보면됨.

 

예제로 살펴보자 

import os 

extension OSLog {
    private static var subsystem = Bundle.main.bundleIdentifier!

    static let ui = OSLog(subsystem: subsystem, category: "UI")
    static let network = OSLog(subsystem: subsystem, category: "Network")
}

이렇게 os_log를 남기면 console에 바로 나오게 된다. 

심지어 error와 fault는 console에서 나오는 색상도 달라서 유용할 듯 하다.

하단에 필터도 있기 때문에 내가 원하는것만 필터링해서 볼 수도 있다.

Q : 여기서 내가 넣은 log (.ui, .network) 같은건 못보나?;; 

A : 콘솔의 왼쪽 switch 같은 버튼을 눌러 메타데이터 역시 같이 볼 수 있다.

 으음 맛있다

 

# Debugging

- LLDB는 타입 요약(type summaries)에서 기본 템플릿 arguments를 생략

AS-IS

(lldb) frame variable
(std::vector<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::allocator<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator <char> > > > > >) nested = size=0 {}

TO-BE

(lldb) frame variable
(std::vector<std::vector<std::string> >) nested = size=0 {}

 --raw-output 옵션을 사용하면 기본 arguments들 계속 볼 수 있음

 

- LLDB는 expression evaluation에서 generic type parameters를 지원

func use<T>(_ t: T) { 
  print(t) // Break here 
}


use(5)
use("Hello!")

요런게 있을 때 T.self == String.self 일때만 브레이크 포인트가 걸리게 할 수 있음.

 

- Xcode에 AppKit 런타임 문제가 표시됨. 

출처 :&nbsp;https://twitter.com/twannl/status/1666546528364949504/photo/1

 

# Documentation

- Xcode 15에는 입력하는 동안 Swift-DocC문서를 실시간으로 미리 볼 수 있는 보조 편집기가 포함됨

(Editor > Assistant > Documentation Preview 선택) 

 

- Xcode 15로 작성된 Document에 외부 모듈에 대한 Swift extensions이 포함됨

예를 들어 내가 SwiftUI의 Image를 extension 했어 

public extension Image {
   /// Create an image from the given sloth.
   ///
   /// This initializer is useful for displaying static sloth
   /// images. To create an interactive view containing a sloth,
   /// use ``SlothView``.
   ///
   /// ![A screenshot of an ice sloth, with the text Ice Sloth underneath.](iceSloth)
   init(_ sloth: Sloth) {
      self.init("\(sloth.power)-sloth")
   }
}

그럼 이 init(_ sloth:) 에 대한 문서가 프로젝트의 나머지 문서와 함께 포함됨

페이지를 제외하려면 DOCC_EXTRACT_EXTENSION_SYMBOLS 빌드 세팅을 NO로 설정

 

# Instruments

- Allocations, Leaks, VM Tracker 에서 .memgraph 파일을 열고 프로세스에 대해 Malloc 스택 로깅이 활성화 된 경우 실시간 Allocations 타임라인을 시각화 할 수 있음. Xcode 메모리 그래프 디버거에 캡쳐된 .memgraph 파일을 기기에서 볼 수 있는 새로운 공유 버튼이 추가됨. 

-  앱 시작 프로파일링과 관련된 static initializers 및 기타 dyld 통계를 시각화하는 dyld Activity가 App Launch 템플릿에 포함되어있음 

푸드트럭 앱으로 해보니까.. Xcode 빌드 타임라인처럼 시각화된게 보이긴 한다. 

 

- 오디오 및 운영체제에 대한 포괄적인 view를 제공하는 Audio System Trace 템플릿이 추가

 

# Linking

- 정적 링크 속도를 크게 향상시키는 새로운 링커가 작성됨

이 링커는 모든 iOS 바이너리와 'Mergeable Libraries'기능을 사용하는 모든 사용자에게 기본값으로 제공됨.

(클래식 링커는 여전히 -ld64를 사용하여 명시적으로 요청할 수 있으며, 향후 릴리스에서 제거될 예정)

 

# Localization

String Catalogs (.xcstrings)는

1. 문자열을 관리하고

2. 번역 진행 상황을 추적하여

=> 앱을 쉽게 localize할 수 있도록 해주는 Xcode의 새로운 파일 타입.

Xcode 14 / Xcode 15 Beta

Xcode는 소스코드에서 loclization 가능한 문자열을 자동으로 추출하여 모든 String Catalogs를 동기화 상태로 유지함

String Catalogs를 기본 에디터에서 보고 편집하여 프로젝트에서 localize된 String을 미리 보고 관리할 수 있음

헐??? 

한번 해보자

File > New > File > Strng Catalogs 추가하면 

Xcode는 소스코드에서 loclization 가능한 문자열을 자동으로 추출하여 모든 String Catalogs를 동기화 상태로 유지함


그러니까 그냥 print("안녕하세요") 이런거를 자동으로 추출해준다는게 아니라.. 

let _ = String(localized: "Hello")
let _ = NSLocalizedString("World!", comment: "어쩌구저쩌구")

 이런식으로  loclization 가능한 문자열이 있는 상태에서 빌드 -> Strng Catalogs를 보면

이렇게 자동으로 추출된 문자열을 볼 수 있다. 

물론 Key를 바꾸면 Strng Catalogs도 같이 바뀐다.

state도 확인할 수 있는 것 같은데 잘 모르겠다.

동기화되면 

이렇게 Report Navigator에도 나오는 듯 하다.

 

# Organizer

- Foundation exception로 인해 발생한 일부 crash는 Organizer에 이유가 표시됨.

있는 경우 backtrace view의 오른쪽에 있는 인스펙터에 표시

 

# Playgrounds

- Playgrounds 콘솔은 Xcode 15의 새로운 콘솔을 사용.

[Xcode 14]

[Xcode 15] 

??? : 필터 기능이 생겼습니다!

 

- 결과 사이드바에는 모든 expressions에 대한 요약이 표시되며 새로운 컨트롤을 사용하면 각 expressions에 대한 세부 정보가 포함된 팝오버 표시

[Xcode 14] 

[Xcode 15]

 


# Previews

- preview에서 사용할 디바이스를 선택할 수 있는 새로운 컨트롤이 생김. 기본적으로 선택한 run destination의 디바이스를 추적함

예를 들어서 내가 iPhone 14 Pro로 선택하고 프리뷰 시작하면 기본적으로 iPhone 14 Pro로 나옴

새로운 컨트롤이 생겼다는 건 

요걸 말하는 듯 하다.

하지만 특정 디바이스 (ex. iPhone 12) 를 보고싶다면 기존의 previewDevice modifier를 사용해야한다. 

 

- #Preview 매크로로 preview를 만들 수 있음. 

SwiftUI

UIView & UIViewController

NSView & NSViewController

widget timeline providers

timeline entries

live activities

모두 지원

Swift Macro뭐 자세히 몰라도됨 #Preview만 사용해보자. 

SwiftUI는 됐고.. UIKit으로 해보자 

import UIKit

final class ZeddView: UIView {

    override init(frame: CGRect) {
        super.init(frame: .zero)
        self.backgroundColor = .gray
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
#Preview {
    ZeddView()
}

 그냥 #Preview 하고 block에 대충 이런식으로 넣어주면

으음 ~~~ 

struct ContentView_Previews: PreviewProvider {

    static var previews: some View {
        ContentView()
    }
}

이제는 위 코드 안쓰고 #Preview {} 로 깔끔하게 할 수 있을듯!? 

 

# Signing and Distribution

- 이제 시뮬레이터 실행 대상을 선택해도 아카이브 작업을 사용할 수 있음. 

Xcode 14 시뮬레이터를 선택한 상태에서는 아카이브가 비활성화 되어있다. / Xcode 15

시뮬레이터를 선택한 상태에서 아카이브를 빌드하면 선택한 플랫폼의 장치에 대한 모든 CPU 아키텍쳐가 포함된 앱이 생성

 

- Xcode Signing & Capabilities탭에서 개발 팀 및 앱 ID와 연결된 Apple 승인 관리 기능 추가 지원 

- xcodebuild -exportArchive는 App Store Connect 인증 키를 사용하여 App Store Connect 및 애플 공증 서비스(Apple notary service)에 앱을 업로드할 수 있도록 지원

- Xcode에서 앱 업로드 상태 푸시 알림을 App Store Connect에 업로드한 사람에게 전달

- Xcode Organizer에서 간소화된 아카이브 배포를 지원. 이제 클릭 한번으로 아카이브 업로드 또는 export를 수행할 수 있음

 

# Source Control

- Source Control 작업 + Xcode Cloud -> 'Integrate' 메뉴로 이동 (기존에는 'Source Control')

[Xcode 14]

[Xcode 15] 

 

- Xcode가 git 스테이징 기능과 완전히 통합되어 코드 커밋이 non-modal 방식으로 수행됨. 

이전에는 커밋을 수행하는 동안 다른 작업을 수행할 수 없었는데, 이제는 사용자 작업 흐름을 중단시키지 않고 커밋 할 수 있다는 뜻 같음 

 

# Source Editor

- #if#endif 블록의 비활성 코드가 이제 흐리게 표시됨. 

이게 내 환경에 따라 결정되는 것 같다!? 

이 기능은 Text Editing > Display 환경설정에서 비활성화할 수 있음

 

- Quick Help에서 문서 주석에 포함된 이미지 렌더링이 지원. (URL같은 외부이미지 + 프로젝트에 있는 로컬이미지 모두 지원)

음 해보니까 안되는데 되시는분.. 

 

- Xcode는 모듈 이름에 대한 참조에서 Quick Help를 호출하여 SDK프레임워크 문서에 접근할 수 있도록 지원. 

ex. SwiftUI import문을 option + 클릭하여 Quick Help를 활성화하면 SwiftUI문서가 표시

 

- Show Code Actions이 Show Quick Actions로 대체. 모든 메뉴 커맨드에 빠르게 접근가능

Command + Shift + A 단축키를 쓰면됨 

 

- 이제 에디터에서 Command + 클릭하면 기본적으로 Definition으로 이동이 수행.

1. Command + Click

[Xcode 14]

Command + 클릭하면 뭐 선택할 수 있는게 뜨고 여기서 선택할 수 있었음. 

Definition로 가려면 여기서 Jump to Definition 선택하거나, control + command + 클릭 해야함 

[Xcode 15] 

Command + 클릭 -> 바로 Definition

 

2. Option + Click

[Xcode 14] 

[Xcode 15]

 

3. Control + Click 

같음 

 

이런것들 Navigation preferences에서 변경할 수 있음

 

- 'Format to multiple lines' 리팩터 액션 추가. (코드를 여러줄로 분할할 수 있음!!!!!!!!!!) 

으음...맛있네요 ㅎ

Format to multiple lines가 안보일 수도 있는데 그럴때는 영역 선택을 잘 해주면 뜬다. (ex. test영역만 선택하면 안됨) 

 

- default parameter가 하나만 포함된 함수는 이제 Code completion에서 자동으로 확장된 상태로 표시.

func test(a: Int = 1, b: Int, c: Int, d: Int) {}

이런 코드가 있다고 했을 때,

[Xcode 14]

[Xcode 15]

 

- default parameter가 2개 이상 포함된 함수에서 오른쪽 방향키를 누르면 해당 parameter의 가능한 모든 순열(permutations)을 표시하도록 확장됨 

func test(a: Int = 1, b: Int = 2, c: Int, d: Int) {}

이런 코드가 있다고 했을 때, 

Xcode 15에서 처음 test를 호출하려고 할 때 아래와 같이 뜸 

그 상태에서 오른쪽 방향키 한번 누르면

이건 정말 맛있을지도

 

Xcode 14 방식 개인적으로 불편했거든여ㅛ

그놈의 frame..에서

오른쪽 방향키 한번만 눌러주면?

편-안

 

- Code completion은 이제 Swift에서 타입을 선언할 때 이름을 제안함

우리는 일단 파일을 만들고 코드를 작성하는데, 타입 이름은 파일의 이름과 같은 경우가 많음 

그럴 때.. 

맛있다 ㅠ

 

# Swift

이건 따로 보는 것으로! 

 

# Swift and C++ Interoperability

- Swift는 C++/객체지향-C++와의 양방향 상호운용성을 지원.

1. Swift에서 C++ API의 하위 집합을 사용 가능

2. C++에서 Swift API를 사용할 수 있음 

빌드 세팅에서 'C++ and Objective-C interoperability'를 활성화하면됨.

https://swift.org/documentation/cxx-interop 참고!

 

# Test Navigator

- Test navigator는 더 빠른 개발-테스트-디버그 루프를 위해 재설계 / 재작성됨. 테스트를 더 빠르게 보고하고 실행하며, 새로운 필터링 시스템을 갖춤 

- Test navigator 필터에서 토큰 사용. 

[Xcode 14]

[Xcode 15]

필터를 설정한 후에는 is / is not도 선택할 수 있음.

is not failed로 선택하면 failed를 제외한 성공, 스킵, 패스된거만 나오게 될 듯 

 

- XCTest는 스크린샷 이외에도 자동 녹화 기능 지원.

화면 녹화를 사용하면 테스트 실행중에 발생한 상황을 세밀하게 볼 수 있으므로 UI Test 실패를 조사하는데 유용. 

화면 녹화는 기본적으로 활성화 되어있음 

 

- 다양한 기기 및 테스트 구성에 대한 테스트 결과를 쉽게 이해할 수 있도록 Xcode의 Test Report가 재설계됨

요런 화면이 추가된 것 같다.

옵션을 설정할 수도 있고

Configuration도 설정가능!? 

이거 맛있을지도.. 

 

댓글이 먼가 이상해서 막아둡니다. 매크로인가?... ㅠ 아니라면 죄송 

 

# 참고

- https://developer.apple.com/xcode/

- https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Overview

반응형