天天看點

swift官方文檔_今年的 Swift,有哪些新的東西呢?

swift官方文檔_今年的 Swift,有哪些新的東西呢?

蘋果官方在美國當地時間 9.20 在 Swift 官方正式官宣了 Swift 5.1。Swift 5.1在Swift 5的基礎上擴充了語言的穩定功能。不過等等,本文不是對官宣文檔的整理,而是整理自 Xcode 11 release note。

Xcode 11 中對 Swift 的支援也有部分更新,包括一些新特性和修複了一些問題。我們在此将與 Swift 相關的内容獨立出來。主要是 Swift 語言本身和 Swift Package 兩部分。SwiftUI 還處在不斷的更新中,是以在此也不提及。而 Swift 編譯器并沒有太多的更新。

如果内容上有問題,可以在留言區留言指出,這樣大家都可以看到問題,在此感謝。

Swift

• 現在可以使用結構和枚舉的 @frozen 屬性。

• 結構的成員初始化器為包含預設表達式的參數提供預設值。

• 現在可以使用類型别名聲明 @autoclosure 參數。 

• 在類中使用 @objc 屬性聲明的方法現在可以傳回 Self。

• Key path 表達式現在可以包含對元組元素的引用。

• 接受 Any 類型的單參數函數不再優先于其他函數。

• 現在完全實作了元組類型之間的轉換。在以前,以下代碼是有問題的:

• 現在可以聲明和使用類型下标,就像類型屬性和類型方法一樣。通過将 static 或在類中使用 class 修飾符應用于下标聲明來聲明一個。

// Declare a type with a static subscript:
enum ProcessEnvironment {static subscript(name: String) -> String? {get { getenv(name) }set { setenv(name, to: newValue) }
    }
}
// Use it with any of these syntaxes:
ProcessEnvironment["PATH"]! += ":/usr/local/bin"
ProcessEnvironment["PATH"]! += ":/usr/local/bin"
someVarOfProcessEnvironmentDotType["PATH"]! += ":/usr/local/bin"
           

類型下标也可以與動态成員查找一起使用以建立動态類型屬性。

// Declare a type with a static subscript:
@dynamicMemberLookup
enum ProcessEnvironment {
    // …As above…static subscript(dynamicMember name: String) -> String? {get { self[name] }set { self[name] = newValue }
   }
}
// Now you can use property syntax with ProcessEnvironment:
ProcessEnvironment.PATH! += ":/usr/local/bin"
ProcessEnvironment.self.PATH! += ":/usr/local/bin"
someVarOfProcessEnvironmentDotType.PATH! += ":/usr/local/bin"
           

• 将 Optional.none 配置設定給具有 none 的枚舉,或者将此類枚舉與 Optional.none 進行比較,現在會産生警告。這樣的表達式會産生歧義,因為編譯器選擇 Optional.none 而不是由您自己的枚舉定義的 none case。

enum Foo { case none }

// Assigned Optional.none instead of Foo.none.
let foo: Foo? = .none
// Comparing with Optional.none instead of Foo.none.
let isEqual = foo == .none
           

編譯器提供警告以及 fix-it,用 Optional.none 或 Foo.none 替換 .none 以解決歧義。

• 函數現在可以通過聲明它符合的協定來隐藏它們的具體傳回類型,而不是指定确切的傳回類型:

調用該函數的代碼可以使用協定的接口,但不能檢視基礎類型。

• Enum case 現在可以與可選枚舉比對,而不需要在模式結尾處使用“?”。

• 現有的 @dynamicMemberLookup 屬性現在支援類型化的 key path 實作。

• 您現在可以使用 Self 表達式來引用結構,枚舉和類聲明自身的類型。例如,此結構中的兩個方法聲明是等效的:

在類中,Self 是 self 值的動态類型,和以前一樣。聲明類型中對 Self 的現有限制仍然适用;也就是說,Self 隻能作為方法的傳回類型出現。但是,Self 現在可以在方法體内使用而沒有限制。 

• Array 和 ContiguousArray 現在有 

init(unsafeUninitializedCapacity:initializingWith:)

 初始化程式,它提供對數組未初始化存儲的通路。

• 對于轉義捕獲 in-out 參數或 noescape 類型值的閉包的限制,已經實作了更徹底的檢查。雖然大多數代碼不受影響,但有一些邊緣情況,Swift 5.0 編譯器接受違反這些限制的代碼。

Swift 5.0 編譯器錯誤接受的無效代碼的示例是一個 @escaping 閉包,它調用一個引用外部作用域的 in-out 參數的本地函數:

編譯器現在通過指出 

localFunction()

 對 x 的捕獲無效來正确診斷上述代碼,因為 localFunction() 是從 @escaping 閉包引用的。

這也解決了某些問題,即編譯器錯誤地将某些代碼診斷為無效,而實際上并未發生違反限制的情況。例如:

func takesNoEscape(_ fn: () -> ()) {func localFunction() {fn()
    }
    { localFunction() }()
}
           

已解決的問題

• 不再允許重複的元組元素标簽,因為它會導緻不正确的行為。

以下現在被診斷為錯誤:

隻要内部标簽不同,您在聲明函數和下标時仍可以使用重複标簽。例如:

• 現在,靜态庫在連結期間總是完全強制加載,修複了大多數“unable to demangle”的運作時錯誤。

• weak 和 unowned 存儲屬性不再影響 Equatable 或 Hashable 一緻性的自動合成。

• 如果崩潰日志中的符号未正确解碼,請運作 swift-demangle 指令并傳入崩潰日志的内容。

• 如果類型與其包含子產品具有相同的名稱,則從子產品接口導入該子產品可以正常工作。

Swift Packages

• Xcode 現在支援使用 Swift packages 建立和使用,以及添加,删除和管理包依賴項。Xcode 中的包管理支援建構在開源 Swift Package Manager 項目之上的項目。

已解決問題

• 無論 Package.swift 清單檔案中聲明的 target 名稱在大小寫上與該 target 的目錄名是否相同,Code completion 均适用于 Swift package 目标。

• 在 Swift package 的 C 系列 target 中添加新檔案不會建立擴充名為 .swift 的檔案。

• 使用 unsafeFlags 建構設定的 Swift package 不能用作依賴項。

推薦閱讀 • iOS 13 正式釋出,來看看有哪些 API 變動 • iOS 實作遠端推送通知國際化 • iOS APP記憶體優化記錄 • 一個好用的 Xcode 擴充:GHWXcodeExtension • 簡談 Machine Code Layout