区块链技术博客
www.b2bchain.cn

Swift 中使用 Option Pattern 改善可选项的 API 设计求职学习资料

D0b2wT.gif

本文介绍了Swift 中使用 Option Pattern 改善可选项的 API 设计求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

SwiftUI 中提供了很多“新颖”的 API 设计思路和 Swift 的使用方式,我们可以进行借鉴,并反过来使用到普通的 Swift 代码中。PreferenceKey 的处理方式就是其中之一:它通过 protocol 的方式,为子 view 们提供了一套模式,让它们能将自定义值以类型安全的方式,向上传到父 view 去。如果有机会,我会再专门介绍 PreferenceKey,但这种设计的模式其实和 UI 无关,在一般的 Swift 里,我们也能使用这种方法来改善 API 设计。

在这篇文章里,我们就来看看要如何做。文中相关的代码可以在这里找到。你可以将这些代码复制到 Playground 中执行并查看结果。

红绿灯

用一个交通信号灯作为例子。

Swift 中使用 Option Pattern 改善可选项的 API 设计

作为 Model 类型的 TrafficLight 类型定义了 .stop.proceed.caution 三种 State,它们分别代表停止、通行和注意三种状态 (当然,通俗来说就是“红绿黄”,但是 Model 不应该和颜色,也就是 View 层级相关)。它还持有一个 state 来表示当前的状态,并在设置时将这个状态通过 onStateChanged 发送出去:

public class TrafficLight {      public enum State {         case stop         case proceed         case caution     }      public private(set) var state: State = .stop {         didSet { onStateChanged?(state) }     }      public var onStateChanged: ((State) -> Void)? }

其余部分的逻辑和本次主题无关,不过它们也比较简单。如果你有兴趣的话,可以查看一下下方加注的部分,但这不影响本文的理解。

为了能让信号灯进行状态转换,我们可以在 TrafficLight 里定义各个阶段的时间:

public var stopDuration = 4.0 public var proceedDuration = 6.0 public var cautionDuration = 1.5

然后用一个 Timer 计时,并进行控制状态的转换:

private var timer: Timer?  private func turnState(_ state: State) {     switch state {     case .proceed:         timer = Timer.scheduledTimer(withTimeInterval: proceedDuration, repeats: false) { _ in             self.turnState(.caution)         }     case .caution:         timer = Timer.scheduledTimer(withTimeInterval: cautionDuration, repeats: false) { _ in             self.turnState(.stop)         }     case .stop:         timer = Timer.scheduledTimer(withTimeInterval: stopDuration, repeats: false) { _ in             self.turnState(.proceed)         }     }     self.state = state }

最后,向外提供开启和结束的方法就可以了:

public func start() {     guard timer == nil else { return }     turnState(.stop) }  public func stop() {     timer?.invalidate()     timer = nil }

在 (ViewController 中) 使用这个红绿灯也很简单。我们按照红绿黄的颜色,在 onStateChanged 中设定 view 的颜色:

light = TrafficLight() light.onStateChanged = { [weak self] state in     guard let self = self else { return }     let color: UIColor     switch state {     case .proceed: color = .green     case .caution: color = .yellow     case .stop: color = .red     }     UIView.animate(withDuration: 0.25) {         self.view.backgroundColor = color     } } light.start()

这样,View 的颜色就可以随着 TrafficLight 的变化而变更了:

Swift 中使用 Option Pattern 改善可选项的 API 设计

青色信号

世界很大,有些地方 (比如日本) 会使用倾向于青色,或者实际上应该是绿松色 (turquoise),来表示“可以通行”。有时候这也是技术的限制或者进步所带来的结果。

The green light was traditionally green in colour (hence its name) though modern LED green lights are turquoise.

— Wikipedia 中关于 Traffic light 的记述

Swift 中使用 Option Pattern 改善可选项的 API 设计

假设我们想要让 TrafficLight 支持青色的绿灯,一个能想到的最简单的方式,就是在 TrafficLight 里为“绿灯颜色”提供一个选项:

public class TrafficLight {     public enum GreenLightColor {         case green         case turquoise     }     public var preferredGreenLightColor: GreenLightColor = .green      //... }

然后在 ViewController 中使用对应的颜色:

SwiftUI 中提供了很多“新颖”的 API 设计思路和 Swift 的使用方式,我们可以进行借鉴,并反过来使用到普通的 Swift 代码中。PreferenceKey 的处理方式就是其中之一:它通过 protocol 的方式,为子 view 们提供了一套模式,让它们能将自定义值以类型安全的方式,向上传到父 view 去。如果有机会,我会再专门介绍 PreferenceKey,但这种设计的模式其实和 UI 无关,在一般的 Swift 里,我们也能使用这种方法来改善 API 设计。

在这篇文章里,我们就来看看要如何做。文中相关的代码可以在这里找到。你可以将这些代码复制到 Playground 中执行并查看结果。

红绿灯

用一个交通信号灯作为例子。

Swift 中使用 Option Pattern 改善可选项的 API 设计

作为 Model 类型的 TrafficLight 类型定义了 .stop.proceed.caution 三种 State,它们分别代表停止、通行和注意三种状态 (当然,通俗来说就是“红绿黄”,但是 Model 不应该和颜色,也就是 View 层级相关)。它还持有一个 state 来表示当前的状态,并在设置时将这个状态通过 onStateChanged 发送出去:

public class TrafficLight {      public enum State {         case stop         case proceed         case caution     }      public private(set) var state: State = .stop {         didSet { onStateChanged?(state) }     }      public var onStateChanged: ((State) -> Void)? }

其余部分的逻辑和本次主题无关,不过它们也比较简单。如果你有兴趣的话,可以查看一下下方加注的部分,但这不影响本文的理解。

为了能让信号灯进行状态转换,我们可以在 TrafficLight 里定义各个阶段的时间:

public var stopDuration = 4.0 public var proceedDuration = 6.0 public var cautionDuration = 1.5

然后用一个 Timer 计时,并进行控制状态的转换:

private var timer: Timer?  private func turnState(_ state: State) {     switch state {     case .proceed:         timer = Timer.scheduledTimer(withTimeInterval: proceedDuration, repeats: false) { _ in             self.turnState(.caution)         }     case .caution:         timer = Timer.scheduledTimer(withTimeInterval: cautionDuration, repeats: false) { _ in             self.turnState(.stop)         }     case .stop:         timer = Timer.scheduledTimer(withTimeInterval: stopDuration, repeats: false) { _ in             self.turnState(.proceed)         }     }     self.state = state }

最后,向外提供开启和结束的方法就可以了:

public func start() {     guard timer == nil else { return }     turnState(.stop) }  public func stop() {     timer?.invalidate()     timer = nil }

在 (ViewController 中) 使用这个红绿灯也很简单。我们按照红绿黄的颜色,在 onStateChanged 中设定 view 的颜色:

light = TrafficLight() light.onStateChanged = { [weak self] state in     guard let self = self else { return }     let color: UIColor     switch state {     case .proceed: color = .green     case .caution: color = .yellow     case .stop: color = .red     }     UIView.animate(withDuration: 0.25) {         self.view.backgroundColor = color     } } light.start()

这样,View 的颜色就可以随着 TrafficLight 的变化而变更了:

Swift 中使用 Option Pattern 改善可选项的 API 设计

青色信号

世界很大,有些地方 (比如日本) 会使用倾向于青色,或者实际上应该是绿松色 (turquoise),来表示“可以通行”。有时候这也是技术的限制或者进步所带来的结果。

The green light was traditionally green in colour (hence its name) though modern LED green lights are turquoise.

— Wikipedia 中关于 Traffic light 的记述

Swift 中使用 Option Pattern 改善可选项的 API 设计

假设我们想要让 TrafficLight 支持青色的绿灯,一个能想到的最简单的方式,就是在 TrafficLight 里为“绿灯颜色”提供一个选项:

public class TrafficLight {     public enum GreenLightColor {         case green         case turquoise     }     public var preferredGreenLightColor: GreenLightColor = .green      //... }

然后在 ViewController 中使用对应的颜色:

SwiftUI 中提供了很多“新颖”的 API 设计思路和 Swift 的使用方式,我们可以进行借鉴,并反过来使用到普通的 Swift 代码中。PreferenceKey 的处理方式就是其中之一:它通过 protocol 的方式,为子 view 们提供了一套模式,让它们能将自定义值以类型安全的方式,向上传到父 view 去。如果有机会,我会再专门介绍 PreferenceKey,但这种设计的模式其实和 UI 无关,在一般的 Swift 里,我们也能使用这种方法来改善 API 设计。

在这篇文章里,我们就来看看要如何做。文中相关的代码可以在这里找到。你可以将这些代码复制到 Playground 中执行并查看结果。

红绿灯

用一个交通信号灯作为例子。

Swift 中使用 Option Pattern 改善可选项的 API 设计

作为 Model 类型的 TrafficLight 类型定义了 .stop.proceed.caution 三种 State,它们分别代表停止、通行和注意三种状态 (当然,通俗来说就是“红绿黄”,但是 Model 不应该和颜色,也就是 View 层级相关)。它还持有一个 state 来表示当前的状态,并在设置时将这个状态通过 onStateChanged 发送出去:

public class TrafficLight {      public enum State {         case stop         case proceed         case caution     }      public private(set) var state: State = .stop {         didSet { onStateChanged?(state) }     }      public var onStateChanged: ((State) -> Void)? }

其余部分的逻辑和本次主题无关,不过它们也比较简单。如果你有兴趣的话,可以查看一下下方加注的部分,但这不影响本文的理解。

为了能让信号灯进行状态转换,我们可以在 TrafficLight 里定义各个阶段的时间:

public var stopDuration = 4.0 public var proceedDuration = 6.0 public var cautionDuration = 1.5

然后用一个 Timer 计时,并进行控制状态的转换:

private var timer: Timer?  private func turnState(_ state: State) {     switch state {     case .proceed:         timer = Timer.scheduledTimer(withTimeInterval: proceedDuration, repeats: false) { _ in             self.turnState(.caution)         }     case .caution:         timer = Timer.scheduledTimer(withTimeInterval: cautionDuration, repeats: false) { _ in             self.turnState(.stop)         }     case .stop:         timer = Timer.scheduledTimer(withTimeInterval: stopDuration, repeats: false) { _ in             self.turnState(.proceed)         }     }     self.state = state }

最后,向外提供开启和结束的方法就可以了:

public func start() {     guard timer == nil else { return }     turnState(.stop) }  public func stop() {     timer?.invalidate()     timer = nil }

在 (ViewController 中) 使用这个红绿灯也很简单。我们按照红绿黄的颜色,在 onStateChanged 中设定 view 的颜色:

light = TrafficLight() light.onStateChanged = { [weak self] state in     guard let self = self else { return }     let color: UIColor     switch state {     case .proceed: color = .green     case .caution: color = .yellow     case .stop: color = .red     }     UIView.animate(withDuration: 0.25) {         self.view.backgroundColor = color     } } light.start()

这样,View 的颜色就可以随着 TrafficLight 的变化而变更了:

Swift 中使用 Option Pattern 改善可选项的 API 设计

青色信号

世界很大,有些地方 (比如日本) 会使用倾向于青色,或者实际上应该是绿松色 (turquoise),来表示“可以通行”。有时候这也是技术的限制或者进步所带来的结果。

The green light was traditionally green in colour (hence its name) though modern LED green lights are turquoise.

— Wikipedia 中关于 Traffic light 的记述

Swift 中使用 Option Pattern 改善可选项的 API 设计

假设我们想要让 TrafficLight 支持青色的绿灯,一个能想到的最简单的方式,就是在 TrafficLight 里为“绿灯颜色”提供一个选项:

public class TrafficLight {     public enum GreenLightColor {         case green         case turquoise     }     public var preferredGreenLightColor: GreenLightColor = .green      //... }

然后在 ViewController 中使用对应的颜色:

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Swift 中使用 Option Pattern 改善可选项的 API 设计求职学习资料
分享到: 更多 (0)
D0b2wT.gif

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们