原文連接canvas
距離 Xcode 10.1 正式版發佈已經將近一個月了,咱們今天從新來回顧一下 Xcode 10.1 的新特性,以及已解決的問題和存在的問題。swift
本文主要參考了《Xcode 10.1 Release Notes》進行整理,同時你也能夠查閱《Xcode 10 Release Notes》獲取更多關於 Xcode 10 的細節。數組
接下來咱們將以新特性(New Features)、已解決的問題(Resolved Issues)、已知問題(Known Issues)等幾方面來介紹 Xcode 10.1 在各模塊上的更新。xcode
若是你想嘗試尚處於開發者預覽版的 arm64e,請在 Xcode 項目編輯器中選擇你的 iOS app 對應的 target,在 Build Settings 中找到 "Architectures" 設置項,選擇 "Other…" 選項,而後添加手動添加 arm64e 到 architectures 列表中。架構
注:目前 App Store 和 TestFlight 並不接受包含 arm64e 的提交,因此當咱們 Archive 後在 Organizer 窗口要向蘋果提交發布時,Xcode 會自動移除掉 app 包中 arm64e 的內容。app
菜單中 Navigate > Open in… 的導航欄 UI 再也不將窗口中的各個 tabs 顯示爲單獨的窗口,每一個窗口都有一個 tab。編輯器
xed 工具如今使用由當前 xcode-select
或 DEVELOPER_DIR
環境變量指定的 Xcode。ide
libunwind
庫進行修改,解決了在 iPhone XS 和 iPhone XS Max 上運行少部分 app 的問題。注:關於這個問題,相信你們已經很熟悉了,網上有不少討論,咱們以前也發了幾條相關的小集。它是在 Xcode 10.0 上開始出現的,而在 Xcode 10.1 剛發佈時,蘋果聲稱已經解決了,後面你們紛紛表示這個問題仍然存在。不過根據微博上的最新消息和小夥伴們的親自驗證,蘋果已經在服務端解決了這個問題,開發者經過 Xcode 10.1 打的 ipa 包在上傳到 App Store Connect 後臺,蘋果在處理包的過程當中會自動修復。函數
新的構建系統支持「按需資源」(On Demand Resources,ODR)。工具
修復了問題:在爲 .xib 文件或 storyboards 使用基本本地化時,不會將與基本文件關聯的各個本地化的 .xib 文件或 storyboards 編譯到產品中。
修復了問題:在將視圖與 UIScrollView
的子視圖添加約束時, Auto Layout 會錯誤報告問題。
提升了畫布(canvas)的性能:當底部設備欄在 iPhone XS、iPhone XS Max 和 iPhone XR 之間切換時。
修復了致使預覽助手編輯器(Preview assistant editor)中監視內容佈局與設備欄選擇不匹配的問題。
如今,當啓用 @IBDesignable
視圖時,將使用新的構建系統進行編譯。
simctl
,在模擬器正在打開時關閉了模擬的設備,則模擬器在下次啓動設備時沒法正確地從新鏈接到模擬器。若是你安裝了多個版本的 Xcode,則在其餘版本的 Xcode 中運行模擬器是可能也會遇到這個問題。*臨時解決方案:*退出並從新啓動模擬器。要在不關閉全部模擬器的狀況下退出,請先按住 Option 鍵並選擇 Simulator > Quit Simulator…,而後在出現的對話框中選擇 "Keep Running"。
例如:
protocol SomeProtocol { }
class SomeClass: SomeProtocol { }
extension SomeProtocol {
var someNonmutatingProperty: CGPoint {
nonmutating set { _ = self }
get { return .zero }
}
}
// Might be miscompiled, deallocating SomeClass() too early.
SomeClass().someNonmutatingProperty.x = 42
複製代碼
*臨時解決方案:*將該操做分解爲多個語句,以便 get 和 set 操做在不一樣的語句中發生:
let someObject = SomeClass()
// First get the nonmutating property value.
var temp = someObject.someNonmutatingProperty
temp.x = 42
// Then modify it.
someObject.someNonmutatingProperty = temp
複製代碼
Xcode 中的 Playgrounds 再也不記錄關於在運行時類型沒法解碼的字段的信息。
如今編譯 Swift 代碼時會始終報告致使任何失敗的錯誤。例如,以前可能會發生諸如 "Command CompileSwiftSources failed with a zeroo exit code" 之類的消息,而沒有伴隨的失敗緣由。
包含空格的長文件路徑將不會再致使構建失敗。
NSBundle
類的 bundleForClass:
初始化方法如今與 Swift 類保持一致,包括即便不在最新的操做系統版本上運行。
如今能夠將以函數類型做爲參數的泛型類的 "let property" 成功傳遞給另外一個函數或方法。
class A<B> {
let function: (B) -> B
}
func takeFunction(_: (Int) -> Int) {}
func passFunction(from a: A<Int>) {
takeFunction(a.function)
}
複製代碼
對嵌套上下文中(nested context)的捕獲值所作的更改如今將反映在外部上下文中(outer context)。
如今能夠成功調用一個在協議類型(protocol type)的值上返回 Self 的變異方法(mutating method):
protocol Example {
mutating func test() -> Self
}
func foo(x: inout Example) {
_ = x.test() // No longer crashes the compiler sometimes.
}
複製代碼
func f(_: [AnyObject])
f([NSObject.self, NSString.self])
複製代碼
FixedWidthInteger
協議中的 unsafeAdding(_:)
, unsafeSubtracting(_:)
, unsafeDivided(by:)
, 以及 unsafeMultiplied(by:)
等方法已棄用(deprecated),並將在之後的版本中刪除。這些方法在溢出條件下會產生未定義的行爲。所以在算術運算的狀況下,可使用 assert
和 addingReportingOverflow(_:)
方法或者 &+
運算符的組合,這二者都會在溢出的狀況下有明肯定義的結果。
*臨時解決方案:*當進行分析測試時能夠經過以下方式禁用並行測試:在 Xcode 菜單欄中打開 Product > Scheme > Edit Scheme... > Test > Info,選擇測試 target 旁邊的 "Options" 按鈕,而後禁用 "Execute in parallet" 複選框。
使用舊版構建系統(legacy build system)的項目中的 UI 測試,目前可支持在 iPhone XS 和 iPhone XS Max 上運行了。
若是一個 UI 測試的目標 app 在模擬器上進行測試期間崩潰了,則如今能夠將其正確地報告爲測試失敗,而不是像以前那樣被錯誤地視爲成功測試,或者顯示有關 "Application state unknown" 失敗信息。
Xcode 10.1 beta 2 及更高版本支持在運行 iOS 12 beta 版的設備上進行 UI 測試。
修復了若是在測試已經開始後的任什麼時候刻添加觀察者,則此時添加到 XCTestObservationCenter
共享實例對象上的觀察者的 testBundleDidFinish:
方法不會被調用的問題(例如:在全部當前註冊的觀察者上調用了 testBundleWillStart:
方法以後)。
當接收器(receiver)是一個菜單項或者菜單項的子視圖時, XCUIElement
類的 click
和 hover
方法如今能夠自動滾動菜單了。
Xcode 10.1 Release Notes developer.apple.com/documentati…
Xcode 10 Release Notes developer.apple.com/documentati…
注:本文翻譯內容若有描述不許確的地方,請參考上述英文原文。