首要,当你见到code里运用到它,或许你想运用它的时分。咱们大概率可以推断出,底子的SwiftUI元素和组件现已没办法满足咱们项目凌乱需求或许定制化的要求了,咱们要Dmacos版别太老无法更新IY一下扩展性更强的View。

今天咱们来好好捋捋这个@ViewBuilder

import SwiftUI
struct ContentView:swiftly Vswift代码是什么意思iew {
var body: soapproveme View {
HStack{
Text("hello")
Text("world")
}
}
}

macoscatalina简单的hello world等级的SwiftUI代码对吧。首要,在SwiftUI的世界里,万物都是View,但你有没有相过,为什么咱们在macos是什么意思HStack这个View里放了两个Text View,它们就可以水平对齐swiftui编程呢,为什么Hstamacosmojaveck可以接受两个View呢?咱们点击HStack的deswift代码查询finition里看看:

@inlinable public init(
alignment: VerticalAlignment = .center,
spacing: CGFloat? = nil,
@ViewBuilder content: () -> Content
)

从源码中咱们可看到,init办法中有一个被@ViewBuilder润饰的闭包content,这意味着这个闭包内部的表达式需要由@Viewmacosx是什么文件夹Builderswift代码处理。它怎样处理呢,Swift在编译被@ViewBuilder润饰macosx是什么文件夹的闭ios14.4值得晋级吗包的时分,会先测验查找@ViewBuilder结构中的静态buildBlock办法,ios是什么意思这个办法有两个View作为参数,咱们先来看一下:

@available(iOS 13.0, Oswift代码查询SX 10.15,appreciate tvOS 13.0, watchOS 6.0, *)
extension ViewBuilder {
public smacos镜像tatic func buildBlock<C0,macos版别太老无法更新 Cswiftcode代码查询1>(_ c0: C0, _ c1: C1) -> TupleView<swift代码查询(C0, C1)> whereswiftly C0 : View, C1 : View
}

从这个ViewBuilder的源码中咱们可以看到,它macos是什么意思接纳两个View作为输入参数,返回一个联合了两个View的TupleView。

你往下阅览源码,会发现还有其他的声明:

@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.macos系统0, *)
extension ViewBuilder {
public static func buildBlock<C0, C1,macoscatalina C2, C3, C4, C5, C6, C7, C8, C9>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8, _ c9: C9) -> TupleView<(C0, C1, C2, C3, C4, C5, Cmacos镜像6, C7, C8, C9)swift选手> where C0 : View,ios系统 C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View, C7 : View, C8 : View, C9 : View
}

这奉告咱们,在现在的SwiftUI版别下,@ViewBuilder润饰的闭包内只能接受十个View.app安装下载

什么叫做TupleView呢?

TupleView是依据视图值的快速元组创立的视图。 TupleView内部没有任SwiftUI何逻辑。 它只保留视图。 TupleView完全通明,其行为类似于其父视图。 这意味着当你将其放入HStack中时,TupleView会将来自元组的视图放置在水平方向上。appear

OK,现在咱们现已理解了@ViewBuilder的作用,咱们来想想怎样运用它。swiftui编程

假定咱们macoscatalina要给咱们的app做notification功用,首要咱们想到这个notificaappeartion应该组件化,但咱们notification的内容应该是多样化的,定制化的。这时分swift选手,咱们可以运用@ViewBuilder

import SwiftUI
struct NotificationView<Content: View>: View {
let content: Content
init(@ViewBuilder content: () -> Conmacos镜像tent) {
self.content = content()
}
var body: someswiftui原理 View {
contentswiftui原理
.paddinmacosx是什么文件夹g()
.background(Color(.tertiarySystemBackground))
.cornerRadius(16)
.transition(.move(edge: .top))
.animation(.spring())appstore
}
}

咱们在这里写了一macosbigsur个NotificationView。在这个View里,咱们制造出了notification底子的款式,但是content的类型是一个ios是什么意思被@ViewBuilder润饰的闭包。这就给了我ios下载们后边自定义推送内容打下了根底APP

当咱们想运用这个NotificationView时,咱们能ios模拟器够这样:

import SwiftUI
struct ContentView: View {
@State private var notificationShown = false
var body: some View {
VStack {
if self.notificationShown {
NotificationView {
Text("notification")
}
}
Spacer()
Buttoswift代码是什么意思n("toggle") {
self.notificatappleidionShown.toggle()
}
Spacer()
}
}
}