Xcode 13.3 Beta 新特性及 Swift 新特性盤點(diǎn)
Xcode 13.3 目前已發(fā)布了兩個(gè) beta 版本,beta 2 于本月 8 號(hào)發(fā)布。不過 beta 2 主要是對(duì)一些問題的修復(fù),新特性不多。Swift 在這個(gè)版本中也新增了幾個(gè)特性,以下是對(duì) Xcode 13.3 中新特性的提取。
構(gòu)建系統(tǒng)
構(gòu)建系統(tǒng)和 Swift 編譯器有一種新模式,可以更好地利用可用內(nèi)核,從而加快 Swift 項(xiàng)目的構(gòu)建速度。該模式是可選的,您可以使用以下用戶默認(rèn)值全局啟用它:
defaults write com.apple.dt.XCBuild EnableSwiftBuildSystemIntegration 1
調(diào)試
在關(guān)閉優(yōu)化的情況下進(jìn)行編譯時(shí),Swift 編譯器和 Clang 不再消除 ARM64 目標(biāo)上的冗余分支指令。這通過啟用更多斷點(diǎn)位置來提高可調(diào)試性,但在使用 -Onone 編譯時(shí)會(huì)產(chǎn)生稍大的二進(jìn)制文件。
文檔
Xcode 現(xiàn)在可以在可執(zhí)行目標(biāo)(如應(yīng)用程序和命令行工具)中從您的 Swift 代碼構(gòu)建文檔。
Instruments
提高了 Instruments、Xcode 的內(nèi)存圖調(diào)試器和泄漏命令行中泄漏掃描的準(zhǔn)確性。系統(tǒng)現(xiàn)在可以更準(zhǔn)確地掃描多負(fù)載枚舉案例中的對(duì)象引用,從而實(shí)現(xiàn)更精確的內(nèi)存泄漏分析以及強(qiáng)、弱和無主引用類型的識(shí)別。
xctrace 現(xiàn)在能夠使用用戶指定的 dSYM 符號(hào)化以前捕獲的跟蹤文件。有關(guān)詳細(xì)信息和語法示例,請(qǐng)參閱 man xctrace 或 xctrace 幫助符號(hào)。
Instruments 現(xiàn)在對(duì)應(yīng)用程序啟動(dòng)的影響較小,使用 App Launch 模板收集的指標(biāo)更能代表其實(shí)際行為。?
atos 現(xiàn)在允許在提供 -offset 標(biāo)志或未指定加載地址或幻燈片的情況下以二進(jìn)制偏移量的形式表示地址。
例如:
atos -arch arm64 -o Example.app/Contents/MacOS/Example 0x00fdae30
Instruments 從跟蹤文檔中刪除了控制臺(tái)視圖。要在跟蹤期間查看輸出和錯(cuò)誤,請(qǐng)從庫中添加 stdout/stderr 工具。新的 stdout/stderr 工具提高了性能和可靠性,但默認(rèn)情況下不再處于活動(dòng)狀態(tài)。
Instruments 現(xiàn)在在工具欄彈出窗口中顯示運(yùn)行問題,而不是在詳細(xì)信息區(qū)域中顯示它們。此外,運(yùn)行問題也會(huì)出現(xiàn)在時(shí)間線上方的標(biāo)尺中,以指示它們發(fā)生的時(shí)間。
Organizer
如果您有 10 個(gè)或更少的應(yīng)用程序并且您之前沒有訂閱任何應(yīng)用程序,Xcode 現(xiàn)在會(huì)自動(dòng)向您發(fā)送應(yīng)用程序的 Smart Insights 通知。要激活此功能,請(qǐng)單擊“回歸”項(xiàng)目或管理器中的任何“度量”項(xiàng)目。
源代碼編輯器
代碼完成現(xiàn)在建議 if case .. 的枚舉實(shí)例
完成不可訪問的符號(hào)時(shí),代碼完成不再自動(dòng)導(dǎo)入模塊。
StoreKit
在 StoreKit 配置文件中,您現(xiàn)在可以復(fù)制、粘貼和復(fù)制產(chǎn)品、訂閱組、訂閱優(yōu)惠和本地化。
在 Xcode 中使用 StoreKit 測(cè)試時(shí),您現(xiàn)在可以在 StoreKit 配置文件中為代碼配置報(bào)價(jià)。在運(yùn)行 iOS 15.4 或更高版本的設(shè)備上進(jìn)行測(cè)試時(shí),您可以兌換這些優(yōu)惠。
您現(xiàn)在可以在 StoreKit 配置文件中切換一種新模式,稱為續(xù)訂時(shí)計(jì)費(fèi)重試。當(dāng)訂閱設(shè)置為續(xù)訂時(shí),此模式會(huì)導(dǎo)致訂閱進(jìn)入模擬的計(jì)費(fèi)重試期。此模式適用于運(yùn)行 iOS 15.4、macOS Monterey 12.3、watchOS 8.5 或 tvOS 15.4 的設(shè)備和模擬器。
您現(xiàn)在可以在運(yùn)行 iOS 15.4、macOS Monterey 12.3、watchOS 8.5 和 tvOS 15.4 的設(shè)備或模擬器上測(cè)試訂閱價(jià)格上漲。您可以使用事務(wù)管理器測(cè)試請(qǐng)求和響應(yīng)訂閱交易的漲價(jià)同意。在運(yùn)行 iOS 15.4 或更高版本的設(shè)備上測(cè)試訂閱價(jià)格上漲時(shí),每個(gè)漲價(jià)同意請(qǐng)求都會(huì)模擬調(diào)用支付隊(duì)列委托方法 paymentQueueShouldShowPriceConsent(_:)。
Swift
當(dāng) non-Sendable 類型跨參與者或任務(wù)邊界傳遞時(shí),Swift 現(xiàn)在會(huì)產(chǎn)生警告以指示潛在的數(shù)據(jù)競(jìng)爭(zhēng)。?
例如:
class MyCounter {
var value = 0
}
func f() -> MyCounter {
let counter = MyCounter()
Task {
counter.value += 1 // warning: capture of non-Sendable type 'MyCounter'
}
return counter
}
您現(xiàn)在可以使用新的 #unavailable 關(guān)鍵字編寫倒置的可用性條件。
例如:
if #unavailable(iOS 15.0) {
// Old functionality
} else {
// iOS 15 functionality
}
您現(xiàn)在可以在類型表達(dá)式和注釋中包含類型占位符。類型占位符指示編譯器根據(jù)通常的類型推斷規(guī)則為該位置設(shè)置類型。要使用類型占位符,請(qǐng)輸入下劃線 (“_”) 而不是類型名稱。
例如:
// This is OK--the compiler can infer the key type as `Int`.
let dict: [_: String] = [0: "zero", 1: "one", 2: "two”]
Swift 編譯器現(xiàn)在在直接調(diào)用從 C 導(dǎo)入的函數(shù)時(shí)接受有限的指針類型不匹配,只要 C 語言允許這些指針類型使用別名。因此,任何 Swift Unsafe[Mutable]Pointer
?或 Unsafe[Mutable]RawPointer 都可以傳遞給聲明為 [signed|unsigned] char * 的 C 函數(shù)參數(shù)。Swift Unsafe[Mutable]Pointer ?也可以傳遞給具有整數(shù)類型的 C 函數(shù)參數(shù),該整數(shù)類型與 T 的區(qū)別僅在于其符號(hào)性。(SE-0324, 87735396)
例如,在導(dǎo)入 C 函數(shù)聲明后:
long long decode_int64(const char *ptr_to_int64);
Swift 現(xiàn)在可以直接將原始指針作為函數(shù)參數(shù)傳遞。
例如:
func decodeAsInt64(data: Data) -> Int64 {
data.withUnsafeBytes { (bytes: UnsafeRawBufferPointer) in
decode_int64(bytes.baseAddress!)
}
}
現(xiàn)在可以在嵌套類型的父級(jí)中正確檢測(cè)到協(xié)議成員的類型簽名中對(duì)自我或所謂的 Self requirements 的引用。因此,您不能在協(xié)議上聲明這些協(xié)議成員。
例如:
struct Outer {
struct Inner {}
}
protocol P {}
extension P {
func method(arg: Outer<Self>.Inner) {}
}
func test(p: P) {
// error: 'method' has a 'Self' requirement and can’t be used on a value of
// protocol type (use a generic constraint instead).
_ = p.method
}
Swift 包管理器
Swift 包現(xiàn)在支持 SE-0303 和 SE-0325 中定義的構(gòu)建工具插件。這允許包定義插件,這些插件可以指定應(yīng)該在構(gòu)建操作期間運(yùn)行的工具,例如生成源代碼。swift 包和 Xcode 對(duì)包的支持都支持這一點(diǎn)。
swift package 命令現(xiàn)在支持 SE-0332 中定義的命令插件。這允許 Packages 定義可以使用 swift package 命令行調(diào)用的命令,以對(duì)包執(zhí)行自定義操作。
測(cè)試(Beta 2)
XCTest 現(xiàn)在支持在 UI 測(cè)試期間重置“本地網(wǎng)絡(luò)”受保護(hù)資源的授權(quán)狀態(tài)。
重復(fù)運(yùn)行測(cè)試時(shí),測(cè)試運(yùn)行器現(xiàn)在將當(dāng)前迭代編號(hào)打印到控制臺(tái)。
