首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用 SwiftUI 创建一个灵活的选择

让我们来看看使用 SwiftUI 创建灵活选择的实现! 可选择协议 选择的最重要部分是,我们可以通过该视图组件选择一些所需的选项。因此,首先创建了一个 Selectable 协议。...所有符合该协议的对象必须实现两个属性:displayedName(在选择中显示的名称)和 isSelected(一个布尔值,指示特定选项是否已选择)。...因此,将使用符合 Selectable 协议的类型 T 创建 FlexiblePicker。这样,以后更容易重用该组件,因为它将是独立于类型的。 在实现选择本身之前,我列出了所有可自定义属性。...需要记住的是,ForEach 循环要求迭代的集合中的每个元素必须符合 Identifiable 协议,或者应该具有唯一的标识符。...然后,详细介绍了实现该选择的逻辑,包括如何处理选项的布局、宽度和高度,以及如何处理用户与按钮的交互。 最后,提供了一个简单的视图实现,可以在 SwiftUI 中使用该选择

24620

ViewBuilder 研究(下) —— 从模仿中学习

视图能够提供的信息 本文中的视图是指符合 SwiftUI View 协议的各种类型 开发者通过 SwiftUI 框架提供的基础视图类型将自定义的视图串联起来,这些视图将向 SwiftUI 提供如下的信息...一个完整功能的视图类型应该提供上述要求的全部定义。目前无法自行实现这几个非公开的方法,仅能使用 SwiftUI 提供的默认实现。...至此,我们已经基本完成了对 SwiftUI 的 ViewBuilder 的仿制,创建了一个可以表述视图层次结构的构建。...ViewBuilder 是视图构建,根据 buildBlock 的定义,它的每个 component 都必须符合 View 协议。...overlay(Text("world")) } } // ModifiedContent, _OverlayModifier> ModifiedContent 通过

3K20
您找到你想要的搜索结果了吗?
是的
没有找到

Ask Apple 2022 与 SwiftUI 有关的问答(上)

在单元测试中,很难对 SwiftUI 视图中的依赖( 符合 DynamicProperty 协议 )进行测试。这也是 Redux-like 框架的优势之一( 将状态从视图中抽离出来,方便测试 )。...NavigationPath 会创建一个完全类型擦除的数据集合,它仅要求元素符合 Hashable 协议。...场景的内容视图定义了场景创建的窗口中的视图内容,但场景本身定义了应用程序的整体结构SwiftUI 4.0 中,WindowGroup 获得了相当大的更新,真正具备了开发 macOS 应用的能力。...不过,在传统的 viewModel 意义上,我不建议将视图结构本身 )作为视图模型。...这就涉及到了所有符合 DynamicProperty 协议的属性包装的一个特点:在视图的生存期内仅有第一次初始化的实例会与视图创建关联。详细请阅读 避免 SwiftUI 视图的重复计算[22] 。

12.2K20

Ask Apple 2022 与 SwiftUI 有关的问答(下)

在更复杂的 UI 中,由于视图的更新速度过快,性能( 至少在 macOS 上 )迅速下降。A:有不同的策略。ObservableObject 是使视图视图层次结构的失效( 引发重新计算 )的单元。...它的唯一要求是元素必须符合 Identifiable 协议。...编译抛出一个错误,说它花了太多时间来检查视图的类型。A:是的,不幸的是,像这样的大型构造表达式有时会让 Swift 编译难以处理。...将视图的功能分散到函数、更小的视图结构以及视图修饰当中是很好的解决方法。...截止 SwiftUI 目前的版本,可以通过以下步骤获取到滑动的距离:自定义 struct, 让它实现 PreferenceKey 协议,其自定义结构体,是需要收集的 gemmetry data (视图坐标信息

14.7K30

SwiftUI 视图的生命周期研究

SwiftUI 内部它会至少创建两种类型的树——类型树、视图值树 类型树 开发者通过创建符合 View 协议的结构体定义想要呈现的用户界面,结构体的 body 属性是一个带有众多参数的庞大类型,...视图值树 在 SwiftUI 中,视图是状态的函数[2]。 开发者通过符合 View 协议的结构体来声明界面,SwiftUI 通过调用结构体实例的 body 获取对应的视图值。...什么是视图 开发者更习惯将符合 View 协议的结构体或结构体实例视作视图,而在 SwiftUI 的角度,视图值树上的节点内容,才是它所认为的视图。...符合 View 协议的结构体实例的生命周期 初始化 通过在结构体的构造函数中添加打印命令,我们很容易就可以获知 SwiftUI 创建了某个结构体的实例。...轻量化的构造 目前,很多 SwiftUI 的开发者都已经注意到了结构体实例会被多次创建的问题。

4.3K30

干货 | 关于SwiftUI,看这一篇就够了

属性代理(propertyDelegate)的出现就是解决这个问题的,属性代理是一个类型,不同类型的属性都能够通过该属性代理进行特定的处理: @propertyDelegate public struct...通过@propertyDelegate的修饰,能够解决不同类型的value进行特定的处理;上述包装的方法,能够建立视图与数据之间的关系,并且会判断在属性值发生变化的情况下,通知SwiftUI刷新视图,编译能够为...Swift 5.1的新特性Property Wrappers(一种属性装饰语法糖)来修饰State,内部实现的大概就是在属性Get、Set的时候,将部分可复用的代码包装起来,上文中说的“属性代理是一个类型...并且对它所包含的方法有一定要求,其隐藏在各个容器类型的最后一个闭包参数中。下面具体介绍所谓的“要求”。...通过该结构发现,与UIKit的布局结构有很大的不同,像按钮的一些属性background、padding、cornerRadius等不应该出现在视图结构中,应该出现在Button视图结构中。

5.8K10

苹果将为 Apple Watch X 铺路 | Swift 周报 issue 45

他们尝试在结构体的 init() 函数中使用 while 循环,但由于编译要求在退出初始化程序之前初始化所有属性而遇到错误。...然而,在 FilterManager 的实现中,尝试将 ShadowFilter 返回为 T 会导致编译错误,因为无法将 ShadowFilter 直接转换为类型 T。...编译还会标记 ShadowFilter.self 的表达式模式与类型之间的不匹配。 T 。 这里的挑战在于尝试在协议函数内有条件地返回特定类型实例,而不需要直接类型转换。...由于 FooBar 包含一个名为 baz 的成员属性,其签名与 Bar 的要求(它从 Foo 获得的属性)相同,因此编译选择它来满足要求。...文章还介绍了使用 SwiftUI 创建康威生命游戏的不同视图,包括使用 Grid 和 Canvas 的不同布局方式。

11610

Swift 中的属性包装

例如,假设我们想创建一个属性包装,自动将分配给它的所有字符串值大写。...解码和重写 尽管为了利用值语义,大多数属性包装可能会实现为结构体,但有时我们可能希望通过使用类来选择引用语义。...self.intValue = intValue self.stringValue = String(intValue) } } 接下来,我们需要一种方法来引用我们的每个标志,而不知道它们的类型...FlagCodingKey> func decodeValue(from container: Container) throws } 有了上述内容,我们现在就可以编写解码代码了,只要Flag类型的值类型是可解码的...即使在诸如SwiftUI这样的声明性框架之外,属性包装也有大量潜在的用例,其中许多不需要我们对整体代码进行任何大的更改——因为属性包装大部分都是完全透明地运行。

2.6K30

我庆幸果断放弃了SwiftUI:它还不够成熟

在 2019 年的 WWDC 大会上,苹果推出了一个全新的 SwiftUI 框架,这是一个现代化的 UI 界面编码结构,它是基于 Swift从头开始构建的。...过程当中,Swift 协议和它处理的方式也给我带来了不少麻烦,但这里我们就不过多展开了。...我还遇到了其他问题,因为 SwiftUI 高度依赖于 View 协议的实现结构,但 View 协议又有关联的类型,所以只能把它当成约束来用。...但在开始实现更复杂的检查视图时,特别是涉及带有 / 不带步进或颜色选择的多个文本字段时,整个运行速度开始剧烈下降。...首先,由可选对象提供的视图在每次重绘时都是在完全重新创建。我虽然通过缓存稍稍提升了性能表现,但实际体验仍然非常糟糕。事实证明,SwiftUI 检查视图就是没法提供合理的重绘速度。

4.9K20

SwiftUI: 从 React 开发人员的角度看 SwiftUI

不仅要知道 属性包装(property wrappers),视图(view)和视图修饰符(view modifiers)是什么,以及它们之间的差异对于使用 SwiftUI 来说是必不可少的,而且对于本文中我将要讨论的某些事情...在下图中,您可以看到一个代码片段,其中包含一个基本的 SwiftUI 视图以及一个视图修饰符和一个属性包装。 ?...要声明一个自定义的SwiftUI视图(如上图所示),您需要做两件事: 声明一个符合View协议的结构。 这意味着我们的结构类型满足视图协议的要求。...需要满足的要求如下: 结构必须具有某些View类型的body属性。 该 body 属性可以包含从单个原始视图SwiftUI框架默认提供的视图)到复杂的嵌套视图的任何内容。...在下面,您将找到两个代码段,第一个包含有效的SwiftUI视图,第二个显示无效的SwiftUI视图的示例: 使用 VStack 和 Text 原语视图的有效 SwiftUI 视图 struct ContentView

2K40

SwiftUI 中实现视图居中的若干种方法

欢迎大家在 Discord 频道[2] 中进行更多地交流将某个视图在父视图中居中显示是一个常见的需求,即使对于 SwiftUI 的初学者来说这也并非难事。...3.0 开始,在使用 background 添加符合 ShapeStyle 协议的元素时,可以通过 ignoresSafeAreaEdges 参数设置是否忽略安全区域,默认值为 .all ( 忽略任何的安全区域...overlay(alignment:.topLeading) 的效果 )使用 postion 将 Text 的中心点与给定的位置进行对齐( postion 是一个通过 CGPoint 来对齐中心点的视图修饰...总结本文选取了一些有代表性的解决方法,随着 SwiftUI 功能的不断增强,会有越来越多的手段可供使用。万变不离其宗,掌握了 SwiftUI 的布局原理,无论需求如何变化都可轻松应对。...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性的问题和技巧制作成 Tips ,发布在 Twitter 上。

6.6K40

StateObject 与 ObservedObject

StateObject 是在 SwiftUI 2.0 中才添加的属性包装,它的出现解决了在某些情况下使用 ObservedObject 视图会出现超预期的问题。...欢迎大家在 Discord 频道[2] 中进行更多地交流先说结论StateObject 和 ObservedObject 两者都是用来订阅可观察对象( 符合 ObservableObject 协议的引用类型...请阅读 [SwiftUI 视图的生命周期研究](SwiftUI 视图的生命周期研究 "SwiftUI 视图的生命周期研究") 一文,了解更多有关视图与实例之间的关系属性包装Swift 的属性包装(...很多情况下,我们需要从视图的角度来理解 SwiftUI 的属性包装名称,例如:ObservedObject ( 视图订阅某个可观察对象 )StateObject( 订阅某个可观察对象,并持有其强引用...我正以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性的问题和技巧制作成 Tips ,发布在 Twitter 上。

2.4K20

在 Text 中实现基于关键字的搜索和定位

请阅读 优化在 SwiftUI List 中显示大数据集的响应效率[6] 以及 避免 SwiftUI 视图的重复计算[7] 两篇文章,了解更多有关性能优化方面的内容通过 currentPostion 获取需要滚动到的...视图中打开 URL 的若干方法[10] 一文,了解更多有关 OpenURLAction 的内容创建体验感优秀的搜索条使用 safeAreaInset 添加搜索栏在没有 safeAreaInset 修饰的时候...阅读 掌握 SwiftUI 的 Safe Area[11] 一文,了解更多有关 safeAreaInset 修饰的内容safeArea_2022-08-22_18.24.59.2022-08-22 18...从本周开始我将以聊天室、Twitter、博客留言等讨论为灵感,从中选取有代表性的问题和技巧制作成 Tips ,发布在 Twitter 上。...视图的重复计算: https://www.fatbobman.com/posts/avoid_repeated_calculations_of_SwiftUI_views/[8] 了解 SwiftUI

4.2K30

避免 SwiftUI 视图的重复计算

符合 DynamicProperty 协议的属性包装 几乎每一个 SwiftUI 的使用者,在学习 SwiftUI 的第一天就会接触到例如 @State、@Binding 这些会引发视图更新的属性包装...对于像 @StateObject 这类针对引用类型的属性包装SwiftUI 会在属性图中将视图与包装对象实例( 符合 ObservableObject 协议 )的 objectWillChange(...与符合 DynamicProperty 协议的属性包装主动驱动视图更新的机制不同,SwiftUI 在更新视图时,会通过检查子视图的实例是否发生变化( 绝大多数都由构造参数值的变化导致 )来决定对子视图更新与否...SwiftUI 并不要求视图类型必须符合 Equatable 协议,因此采用了一种简单、粗暴但十分高效地基于 Block 的比对操作( 并非基于参数或属性 )。...另外,不要在视图的构造函数中为属性( 没有使用符合 DynamicProperty 协议的包装 )设置不稳定值( 例如随机值 )。

9.2K81

聊一聊可组装框架( TCA )

它具备数组的全部功能和接近的性能,要求其中的元素必须符合 Identifiable 协议,且 id 在 identifiedArray 唯一。...通过使用 SwiftUI 的 task 修饰,TCA 实现了对需要长时间运行的 Effect 的生命周期进行自动管理。...更加友好的 IDE 支持在未使用 Protocol 模式之前,Reducer 是通过一个拥有三个参数的闭包生成的,在此种模式下,Xcode 的代码补全功能将不起作用,开发者只能通过记忆来编写代码,效率相当低下...性能在 TCA 中,State、Action 都被要求符合 Equatable 协议,并且同很多 Redux like 解决方案一样,TCA 无法提供对引用值类型状态的支持。...如何学习 TCA尽管 TCA 在很大程度上减少了在视图中使用其他依赖项( 符合 DynamicProperty 协议 )的机会,但开发者仍应对 SwiftUI 提供的原生依赖方案有深刻的认识和掌握。

1.7K20

Swift 周报 第十期

利用简洁且强大的 Swift 和 SwiftUI 以及全新的跨平台 App 体验,使用编辑的增强功能更快捷地编写代码,并着手开始进行从 Xcode Cloud 到 TestFlight 以及 App...但是存在类型中的基本类型仍然存在,一旦你有一个存在类型的值,你就很难对其使用。...与一样,它们使函数能够获取和返回多种可能的类型。与参数类型不同,存在类型在作为输入传递给函数时不需要预先知道。此外,当从函数返回时,可以删除具体类型(隐藏在协议接口后面)。...尽管它不是提案的一部分,但对 SE-0335[16] 的讨论包括对编译标志的请求,以在存在类型上要求使用 any 。...SwiftUI 动画进阶 — Part 5:Canvas 摘要: 本篇文章将探索 Canvas 视图

2.1K00

探讨 SwiftUI 中的几个关键属性包装

在这篇文章中,我们将探讨几个在 SwiftUI 开发中经常使用且至关重要的属性包装。本文旨在提供对这些属性包装的主要功能和使用注意事项的概述,而非详尽的使用指南。...本文应几位朋友之邀而写,旨在帮助已经熟悉通用编程但对 SwiftUI 相对陌生的开发者,快速理解这些属性包装的核心作用和适用场景。...@State @State 是 SwiftUI 中最常用的属性包装之一,主要用于在视图内部管理私有数据。它特别适合存储值类型数据,如字符串、整数、枚举或结构体实例。...属性包装本质上是一个结构体。使用 @ 前缀时,它用于包装其他数据;而不带 @ 时,表示其自身类型。...中用于管理符合 ObservableObject 协议的对象实例的属性包装,以确保这些实例的生命周期与当前视图一致( 不短于)。

18810

Swift5.7 扩展不透明类型(some)到参数

比如,下面这个函数描述在水平方向组合两个 SwiftUI 中的视图:func horizontal(_ v1: V1, _ v2: V2) -> some View...对返回的结果来说,又可以使用不透明类型(opaque result type)some来隐藏实际的返回值,仅通过它符合的协议来描述它。...,更加方便阅读和理解:它接受两个视图视图的具体类型这里不重要),并返回一个视图(返回的视图类型也不重要)。...还有2个场景限制使用:可变和函数类型的参数。可变不透明类型不能在可变参数中使用。比如下例中的可变参数 P......针对上述不同参数的报错,有一种可能的解决方案是:对于可变,可以将隐式参数改为参数包,也就是模版中P改为P...,此时约束从遵循同一类变成支持不同类型的(感觉支持了所有类型?

2.9K141
领券