SwiftUI中@ViewBuilder的相关知识点解密.docx

SwiftUI中@ViewBuilder的相关知识点解密.docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

SwiftUI中@ViewBuilder的相关知识点解密

@resultBuilder是在Swift5.4添加的,之前是叫@_functionBuilder,在这里我们可以简单了解一下它的作用。

一个类、结构体添加@resultBuilder注解时必须包含至少一个buildBlock方法,并且这个方法是static静态的。这个方法可以接收0个或多个参数,在函数内部确定了参数的组成形式。

比如下面这个例子:

@resultBuilderstructStringBuilder{

staticfuncbuildBlock(_string1:String,_string2:String,_string3:String)-String{

string1+-+string2+-+string3

functest(@StringBuilderstrings:()-String){

print(strings())

test{

StringBuilder是一个字符串构建者结构体,里面的buildBlock方法接收3个参数,并且在3个参数中间插入”-“作为函数的返回值。

test函数接收一个使用@StringBuilder修饰的名为strings的闭包作为参数,函数体是调用这个闭包并打印到控制台。

最后使用3个字符串作为参数调用test函数,执行这段代码后会得到”1-2-3”的输出结果

@ViewBuilder定义

先来看ViewBuilder的定义:

@resultBuilderstructViewBuilder

ViewBuilder本质上是一个结构体,并且被@resultBuilder注解,也就是说ViewBuilder是一个reultbuilder(结果建造者)类型了。

ViewBuilder结构体有11个名为buildBlock的函数,分别接收从0到10个View类型的参数,因此在SwiftUI中一个接收@ViewBuilder类型参数的视图容器最多能接收10个子视图,如果不能满足需求可以通过拆分来增加子视图的个数。

@ViewBuilder的用法

使用@resultBuilder注解ViewBuilder结构体后,就可以用@ViewBuilder修饰闭包,这个闭包可以接收多个指定类型的对象,而这些对象会按照buildBlock函数的实现进行组织。

Acustomparameterattributethatconstructsviewsfromclosures.

这是Apple的官方文档对ViewBuilder的定义,简单来说ViewBuilder就是一个包含多个视图的闭包。

在SwiftUI框架中,所有的容器视图都是使用@ViewBuilder来修饰最后一个参数,因此这些容器视图可以接受多个子视图作为参数。比如HStack/VStack/ScrollView等。

//HStack

publicstructHStackContent:ViewwhereContent:View{

@inlinablepublicinit(alignment:VerticalAlignment=.center,spacing:CGFloat=nil,@ViewBuildercontent:()-Content)

这是HStack的初始化方法,其中前面的几个参数都是可选项,它们不在本篇文章的讨论范围内。

它的最后一个参数content的类型是一个返回值为Content的闭包,单看()-Content是一个没有参数的闭包,但是前面使用了@ViewBuilder修饰,这就是一个可以接收多个视图的闭包了,最终看起来像是这样的:(view1:Content,view2:Content....)-Content。

下面我们通过自定义一个视图来看@ViewBuilder的用法。

实践

下面通过实现一个自定义的容器视图来展示@ViewBuilder的用法:

@ViewBuilder示例

自定义一个继承自View名为CustomContainerView的视图,它仅有一个接收@ViewBuilder类型参数的初始化方法,并使用常量content接收这个参数。

在body中构建当前视图:@ViewBuilder中可能包含多个子视图,因此使用VStack把这些子视图纵向排列,之

文档评论(0)

135****5541 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档