SwiftUI 中的“some”關鍵字是什麼?
SwiftUI 中的“some”關鍵字用於指示某個型別符合某個協議,但沒有指定具體的符合型別。AnyView 型別是一種型別擦除檢視,可以表示符合 View 協議的任何檢視,通常與它一起使用。
SwiftUI 將 some View 定義為一種型別,它可以在不識別特定檢視型別的情況下表示符合 View 協議的任何檢視。這使得程式碼更通用和靈活。
換句話說,some 關鍵字用於宣告不透明型別。在 Swift 5.1 版本中,它隨著不透明返回型別的支援而引入。
什麼是“不透明型別”?
當您使用不透明型別時,意味著您可以宣告預期的返回型別,而無需定義確切的型別。
例如,您可以使用 some View 建立一個可以儲存任何檢視的變數,而無需知道該檢視的具體型別。以下是一個示例
let anyView: some View = Text("Hello, World!")
這將建立一個名為 anyView 的變數,該變數可以儲存符合 View 協議的任何檢視,並將其值設定為顯示字串“Hello, World!”的 Text 檢視。
為了建立一個可以儲存符合某個協議的任何型別的變數,而無需知道它將攜帶的特定型別,some 關鍵字用作型別約束。
返回不透明型別而不匹配確切型別
如果我們不返回確切的型別會發生什麼?在這種情況下,您將收到如下所示的錯誤。
示例
包含錯誤的程式碼示例如下所示:
import SwiftUI
func makeHeaderView(isProUser: Bool) -> some View {
if isProUser {
return Text("You have a premium membership !!") // return type is Text
} else {
return VStack { // Return type is VStack)>>
Text("Do you want to become a PRO user?")
Button("Become PRO", action: {
// write action code
})
}
}
}
輸出
此程式碼將給您一個如下所示的錯誤
error: function declares an opaque return type 'some View', but the return statements in its body do not have matching underlying types
如您在上面的程式碼中看到的,我們正在返回兩種型別的資料。為 PRO 使用者返回 Text,為非高階使用者返回 VStack。
在這種情況下,編譯器希望透過“some”關鍵字瞭解底層的具體型別。為了在同一方法範圍內返回不同的型別,必須為該值的範圍修復不透明型別。
我們可以透過使用包裝容器(如 VStack)來解決上述程式碼
import SwiftUI
func makeHeaderView(isProUser: Bool) -> some View {
VStack {
if isProUser {
Text("You have a premium membership !!") // return type is Text
} else {
Text("Do you want to become a PRO user?")
Button("Become PRO", action: {
// write action code
})
}
}
}
我們添加了一個額外的容器,只有當 isProUser 屬性返回 true 時才需要它。在上面的程式碼中,與其使用結果構建器,不如使用 @ViewBuilder 屬性重寫它:
import SwiftUI
@ViewBuilder
func makeHeaderView(isProUser: Bool) -> some View {
if isProUser {
Text("You have a premium membership !!") // return type is Text
} else {
Text("Do you want to become a PRO user?")
Button("Become PRO", action: {
// write action code
})
}
}
結論
總之,SwiftUI 中的“some”關鍵字用於告訴編譯器返回型別,而不告訴返回檢視的確切型別。這樣,您可以隱藏關鍵資訊。
為了返回“some”型別,您可以使用包裝器作為容器。此外,您可以使用 @ViewBuilder 屬性代替結果構建器。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP