迅速使用选择模式如何改善可选项的API设计?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
SwiftUI中提供了很多“新颖”的API设计思路和迅速的使用方式,我们可以进行借鉴,并反过来使用到普通的迅速代码中。<代码> PreferenceKey> 代码的处理方式就是其中之一:它通过协议的方式,为子视图们提供了一套模式,让它们能将自定义值以类型安全的方式,向上传到父视图去。如果有机会,我会再专门介绍<代码> PreferenceKey> 代码,但这种设计的模式其实和UI无关,在一般迅速的里,我们也能使用这种方法来改善API设计。
在这篇文章里,我们就来看看要如何做。文中相关的代码可以在这里找到。你可以将这些代码复制到操场中执行并查看结果。
<强>红绿灯强>
用一个交通信号灯作为例子。
作为模型类型的<代码> TrafficLight> 代码类型定义了<代码>鸡毛蒜皮代码>,<代码>。进行代码>和<代码>。注意代码>三种<代码> 代码>,它们分别代表停止,通行和注意三种状态(当然,通俗来说就是“红绿黄”,但是模型不应该和颜色,也就是视图层级相关)。它还持有一个<代码> 代码>状态来表示当前的状态,并在设置时将这个状态通过<代码>公共类TrafficLight { 公共枚举状态{ 情况下停止 情况下进行 情况下谨慎 } 公私(套)var状态:状态=鸡毛蒜皮{ didSet{>光=TrafficLight () 光。onstatechange={(弱自我)状态 让其他自我=自我{返回} 让颜色:用户界面颜色 开关状态{=.green案例.proceed:颜色=.yellow案例.caution:颜色 案例鸡毛蒜皮:颜色=r } UIView。动画(withDuration: 0.25) { self。view。写成backgroundColor=颜色 } } light.start ()
这样,视图的颜色就可以随着<代码> TrafficLight> 代码的变化而变更了:
<强>青色信号
强>
世界很大,有些地方(比如日本)会使用倾向于青色,或者实际上应该是绿松色(青绿色),来表示”可以通行”。有时候这也是技术的限制或者进步所带来的结果。
绿灯是传统上绿色的颜色(因此得名)尽管现代领导绿灯是蓝绿色的。
——维基百科中关于红绿灯的记述
引用>
假设我们想要让<代码> TrafficLight 代码>支持青色的绿灯,一个能想到的最简单的方式,就是在<代码> TrafficLight> 代码里为“绿灯颜色”提供一个选项:
公共类TrafficLight { 公共enum GreenLightColor { 情况下绿色 情况下青绿色 } 公共var preferredGreenLightColor: GreenLightColor=.green//? }然后在<代码> ViewController> 代码中使用对应的颜色:
TrafficLight延伸。GreenLightColor { var颜色:用户界面颜色{ 开关自{ 案例.green: 返回.green 案例.turquoise: 返回用户界面颜色(红色:0.25,格林:0.88,蓝色:0.82,α:1.00) } } } 光。preferredGreenLightColor=.turquoise 光。onstatechange={(弱,弱光)状态 警卫让自我=自我,让其他光={返回}//?/例.proceed:颜色=.green=light.preferredGreenLightColor.color案例.proceed:颜色 }这样做当然能够解决问题,但是也会带来一些隐患。首先,需要在<代码> TrafficLight> 代码中添加一个额外的存储属性<代码> preferredGreenLightColor> 代码,这使得<代码> TrafficLight> 代码示例所使用的内存开销增加了。在上例中,额外的<代码> GreenLightColor 代码>属性将会为每个实例带来8字节的开销。如果我们需要同时处理很多<代码> TrafficLight 代码>实例,而其中只有很少数需要<代码> .turquoise> 代码的话,这个开销就非常可惜了。
严格来说,上例的TrafficLight。GreenLightColor枚举其实只需要占用1个字节。但是64位系统中在内存分配中的最小单位是8个字节。
如果想要添加的属性不是像例子中这样简单的枚举,而是更加复杂的带有多个属性的类型的话,这一开销会更大。
迅速使用选择模式如何改善可选项的API设计