티스토리 뷰

공부

Xcode 12.5 Beta Release Notes 📝

Zedd0202 2021. 2. 2. 11:59
반응형

 

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

자고 일어나니..Xcode 12.5 베타가 나왔군요..

릴리즈노트를 보며 어떤 기능이 추가되었는지 보려고 합니다@!!!

그냥 제가 관심있는것만 볼 예정입니당 

Xcode 12.5 Beta Release Notes

 

[Build System > New Features]

✔️ hosting app target을 빌드 할 때 빌드시스템이 더이상 hosting app target에 다시 서명(re-sign)하지 않습니다. 대신 app target의 sign작업이 실행되기 전에, test target을 빌드합니다.

-> 추가 코드서명(codesign)작업이 제거되어 test target이 있는 대규모 앱의 빌드속도가 빨라지게 됩니다.

✔️  이제 xcodebuild는 XCFramework를 만들 때 archive플래그를 지원하여 하나 이상의 archive에서 XCFramework를 만드는 방법을 제공합니다.

xcodebuild -archive <archive_path1> -framework MyFramework.framework -archive <archive_path2> -framework MyFramework.framework -o <output_xcframework_path>

 

[Code Completion > New Features]

✔️  Code Completion은 오류가 있는 expression과 추가 context가 없는 모호한 expression에서 더 안정적이게 되었습니다. 

예를들어, 

func test(a: Int, b: String) -> Int { ... }
func test(a: Int, b: Int) -> String { ... }
func test(a: (Int, Int) -> Int) -> Int { ... }

test().prefix(3). 후 code completion은 String멤버를 제안합니다.

test(a: 2).  후 code completion은 Int 및 String 멤버를 제안합니다.

$0. code completion은 다음 블록에서 Int멤버를 제안합니다.

test {
  $0.
}

 

[Interface Builder > New Features]

✔️  이제 NSObjectController및 유사한 객체에 대한 인스펙터에서 사용자 정의 클래스에 대한 모듈을 구성할 수 있습니다. 

 

[Localization > New Features]

✔️ 이제 Xcode를 사용하여 applications을 모든 ISO 639언어로 localize할 수 있습니다.

✔️  이제 workspaces를 사용하여 localize할 프로젝트 모음을 내보내(export)
workspace의 모든 프로젝트에 대해 single localization catalog를 생성 할 수 있습니다. 

✔️  새로운 Localization Export Supported build를 사용하면 localization이 필요하지 않은 특정 Target 또는 프로젝트에 대해 localization export를 비활성화 할 수 있습니다.

 

[Playgrounds > New Features]

✔️  이제 앱 프로젝트 플레이그라운드가 앱 Target 심볼에 접근 할 수 있습니다. 생성한 새 플레이그라운드 문서에서 이 기능을 활성화 하려면 File inspector에서 Import App Types옵션을 켜면 됩니다.

기존에는 플레이그라운드를 프로젝트에 추가한 후

이렇식으로 앱 타겟에 있는 심볼에는 접근을 못했습니다. 예제는 ZeddProtocol은 앱 타겟에 있는 프로토콜입니다. 

Xcode 12.5부터,

Import App Types를 선택하면, 이렇게 앱 Target에 있는 심볼들에 접근이 가능하게 됩니다. 

 

[Simulator > New Features]

✔️  Simulator는 새로운 비디오 녹화 기능을 사용하여 비디오 녹화에서 animated GIFs를 만들 수 있습니다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ!!!!!!!!!

1. 비디오를 녹화한 후

2. 비디오 미리보기를 마우스 오른쪽 클릭

3. Save as Animated GIF클릭

비디오 파일과 Animated GIF를 모두 유지하려면 Option을 누른 상태에서 Save Copy as Animated GIF클릭. 

시뮬레이터 환경 설정에서 생성된 GIFdimensions과 Size를 조정 할 수 있습니다.

와 너무너무너무 편해요 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ!!!!!!!!! 진짜 맨날 이거 한다고 녹화하고..gif로 변환하고 ㅠㅠㅠㅠ

애플 사랑해!!!!!!!!!

참고로 Save as Animated GIF누르면 Desktop > 이미지 쪽에 저장되더라구요! 참고하세요 ~.~

 

[Swift > New Features]

✔️  대부분의 경우 증분 컴파일이 더 빠릅니다. 구조체, 클래스, 열거형(enum), 프로토타입(?) 또는 extension의 body내에서 코드를 변경 할 때 Swift는 이제 이전보다 훨씬 적은 수의 파일을 해당 모듈에서 다시 컴파일 합니다.

✔️  Implicit member expressions(암시 적 멤버 표현식)은 이제 멤버 접근 체인을 지원합니다.

예를들어 다음 코드가 이제 유효합니다.

let milky: UIColor = .white.withAlphaComponent(0.5)
let milky2: UIColor = .init(named: "white")!.withAlphaComponent(0.5)
let milkyChance: UIColor? = .init(named: "white")?.withAlphaComponent(0.5)

ㅎ ㅏ ㅁㅊ 진짜 이거 이제 된다고???? ㅁㅊㅁㅊ...

기존의 Implicit member expressions syntax경우와 마찬가지로, 체인의 결과 타입은 (암시적) base와 동일해야하므로,

cgMilky: CGColor = .white.withAlphaComponent(0.5).cgColor

를 작성하는것은 적절하지 않습니다.


Q : 왜/!?!? .white.withAlphaComponent(0.5).cgColor 는 CGColor잖아.. cgMilky도 CGColor니까 되어야하는거 아니야?

체인의 결과 타입은 (암시적) base와 동일해야한다고 그랬죠?

cgMilky: CGColor = .white

 base = CGColor

체인의 결과 타입 = UIColor

즉 white가 CGColor타입이 아니기 때문에 에러가 나는것입니다!


"체인"의 구성원은 프로퍼티, 메소드 호출, subscript 접근, force unwraps, optional chaining question marks일 수 있습니다.

또한 체인을 따라 각 멤버의 타입이 다를 수 있습니다. 

struct Foo {
  static var foo = Foo()
  static var bar = Bar()

  var anotherFoo: Foo { Foo() }
  func getFoo() -> Foo { Foo() }
  var optionalFoo: Foo? { Foo() }
  subscript() -> Foo { Foo() }
}

struct Bar {
  var anotherFoo = Foo()
}

let _: Foo? = .bar.anotherFoo.getFoo().optionalFoo?.optionalFoo![]

위와 같은 성공적인 타입 검사를 의미합니다. (와 스태틱....bar..)

✔️  Swift는 Objc에서 데이터를 연결할 때 더 많은 검사(check)를 포함합니다. 특히 런타임 라이브러리는 null값을 포함하는 nullable이 아닌 포인터를 감지하면, 적절한 오류메세지와 함께 프로그램을 중단합니다.

✔️  이제 지역변수에서 Property wrappers가 지원됩니다.

✔️  함수, subscripts, 이니셜라이저는 이제 가변 매개변수(variadic parameter)를 따르는 모든 매개변수에 레이블이 지정되어있는 한 둘 이상의 가변 매개변수를 가질 수 있습니다.

func foo(_ a: Int..., b: Double...) { }

struct Bar {
  subscript(a: Int..., b b: Int...) -> [Int] { a + b }

  init(a: String..., b: Float...) { }
}

이건..좀 더 첨언하자면,

함수, subscripts, 이니셜라이저에 variadic parameter는 한개만 가질 수 있었습니다.

하지만 이제는 레이블만 달려있다면1@@!!! 둘 이상의 variadic parameter를 가질 수 있게 되는것이죠.

이렇게! 

 

[Swift Packages > New Features]

✔️  5.2 tool version을 지정하는 Swift Package는 이제 Target을 실행파일로 명시적으로 선언할 수 있으며, Package코드 내에서 @main키워드를 사용할 수 있습니다.

✔️ Swift Package Manager는 사용자별로 package dependency를 캐시하여 네트워크 트래픽 양을 줄이고, 동일한 package 후속 사용에 대한 dependency 해결 성능을 향상시킵니다.

필요한 경우 new -disablePackageRepositoryCache 플래그를 비활성화 할 수 있습니다.

 

[Testing > New Features]

✔️  이제 XCTests는 테스트 실패를 "expected(예상)"으로 표시하는 것을 지원합니다.

expected 테스트 실패는 테스트가 포함된 suite의 전체합격/불합격 결과에 영향을 주지 않습니다.

Xcode는 테스트 네비게이터 및 테스트 보고서에 expected 실패를 다르게 표시하고, expected 실패가 발생한 코드 줄을 설명과 함께 강조합니다.

expected 테스트 실패는 즉시 해결할 수 없는 실패가 있을 때 프로젝트 테스트 suite의 "green" state를 유지하기 위한 오버헤드가 적은 도구를 제공하여 새로운 실패를 명확하게 볼 수 있도록 합니다.

XCTSkip으로 테스트를 건너뛰는 것과 달리 expected 실패가 있는 테스트는 계속 실행되어 예기치않은 변경 사항을 보고하게 됩니다.

실패를 expected로 표시하려면, 테스트 실패를 생성하는 코드 전에, 테스트에서 XCTExpectFailure API를 호출하세요. 

XCTExpectFailure("…")
// Perform test which currently fails

또한 expected 실패의 범위는 실패한 코드를 클로저로 묶어 제한 할 수 있습니다.

// Arrange and act on the test subject

XCTExpectFailure("…") {
    XCTAssert(…) // Failing assertion
}

// Continue test with further assertions etc.

기본적으로 XCTExpectFailure가 호출되었지만, 테스트에서 실패를 기록하지 않으면 XCTest는
“unmatched expected failure”로 인해 테스트가 실패한것으로 표시합니다.

isStrict 프로퍼티를 false로 설정하여 XCTExpectFailure에 XCTExpectedFailure.Options 객체를 매개 변수로 전달하여 비 결정적으로 발생하는 실패에 대해 이를 억제 할 수 있습니다.

let options = XCTExpectedFailure.Options()
options.isStrict = false
XCTExpectFailure("…", options: options)
// Perform test which sometimes fails

 

아직 정확히 이해가 가지 않으시다면, XCTExpectedFailure글을 읽어보시는 것도 추천드립니다..👀

 

✔️ 이제 Xcode Product menu에서 Clean Test Results를 선택하여 작업 공간을 다시 열지 않고도 테스트 결과를 정리 할 수 있습니다.

✔️  watchOS앱에 대한 XCTest unit / UI tests를 지원합니다. 

✔️  이제 XCTest는 macOS 11.3, iOS 14.5, tvOS 14.5, watchOS 7.4이상 OS버전에서 테스트를 실행 할 때, Swift generic test의 특수 하위클래스(specialized subclasse)를 자동으로 포함합니다. 이를 통해 generic을 사용하여 테스트 클래스의 재사용성을 향상시킬 수 있습니다.

✔️ 이제 XCTests는 XCTAssertEqual보다 좀 더 엄격한(stricter) XCTAssertIdentical, XCTAssertNotIdentical API가 추가되었다고 합니다.(Swift에서 두 객체가 같은지 == 대신 ===를 사용하는 것을 사용하여) 

 

이정도 인데요! 제가 흥미가 있는것만 봤어요ㅎㅎㅎ!

보통 그대로 넘어오지만..아직 정식이 아니라 베타라는 점..! 잊지마세요.

더 자세한건 Xcode 12.5 베타 릴리즈 노트를 참고해주세요 ~.~ 

틀린 점이 있다면 댓글로 알려주세요!!

 

+ 프로토콜에 AnyObject의 typealias인 class 키워드를 사용하는게 deprecate되었네요!

이제 명시적으로 AnyObject를 사용해야 할 것 같습니다. 

class와 AnyObject에 대해 알고싶으시다면 이 글을 참고해보는 것도 나쁘지 않겠네요..👀

💡 AnyObject 프로토콜을 프로토콜의 상속목록에 추가하여 프로토콜 채택을 클래스 타입(구조체 또는 열거형이 아닌)을 제한할 수 있습니다.
➞ AnyObject를 상속한 프로토콜은 클래스만 채택할 수 있다!!! (https://zeddios.tistory.com/347)

 

반응형