SwfitUI中some关键字是什么含义?

以下是打开新建SwiftUI项目的默认代码。

import SwiftUI

struct ContentView: View {
    
    
    var body: some View {
    
    
        Text("Hello, World!")
    }
}

struct ContentView_Previews: PreviewProvider {
    
    
    static var previews: some View {
    
    
        ContentView()
    }
}

ContentView遵循View协议,View协议要求一个名为body类型为some View的计算属性。你可能会疑问some关键字的作用?

Opaque Types

some关键字在Swift 5.1版本中被引入,定义为一个不透明类型。不透明类型是一种而无需提供具体类型的返回类型。限制调用者需要了解的有关返回类型的信息,仅仅公开有关其协议遵从性的信息。

使用不透明类型是一种让编译器根据返回值来决定函数返回的具体类型发方法。

在SwiftUI中,some View意味着body始终实现View协议,但调用者无需知道具体的实现类型。

在Swift文档中对不透明类型的解释:

You can think of an opaque type like being the reverse of a generic type.

An opaque type lets the function implementation pick the type for the value it returns in a way that’s abstracted away from the code that calls the function.
你可以认为不透明类型就像是通用类型的逆向。
不透明类型可以使函数实现从调用函数的代码中抽象出来的方式为返回的值选择类型。

换句话说,标准的通用占位符由调用者填充。 调用泛型函数时,您会将泛型类型限制为传递给该函数的类型。 您可以将不透明类型视为一种泛型函数,其中,占位符类型由实现返回类型填充。

以下代码不包含一个合法的不透明类型,两个代码分支返回不同的具体类型,第一个选择分支返回Text View,第二个分支返回VStack View。

struct ContentView: View {
    
    
    var x: Bool = false
    
    var body: some View {
    
    
        if x {
    
    
            return Text("This is true")
        } else {
    
    
            return VStack {
    
     Text("This is false") }
        }
    }
}

返回类型在编译时并不能被知道,所以是一个非法的不透明类型。

猜你喜欢

转载自blog.csdn.net/WxqHUT/article/details/107562156