• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

swift使用协议protocols 进行复合扩展

武飞扬头像
linzhiji
帮助1

ViewController 增加等待指示器(菊花)

原代码

  1.  
    import UIKit
  2.  
     
  3.  
    class BaseViewController: UIViewController {
  4.  
    private let activityIndicator = UIActivityIndicatorView(style: .whiteLarge)
  5.  
     
  6.  
    override func viewDidLoad() {
  7.  
    super.viewDidLoad()
  8.  
    view.addSubview(activityIndicator)
  9.  
     
  10.  
    activityIndicator.translatesAutoresizingMaskIntoConstraints = false
  11.  
    NSLayoutConstraint.activate([
  12.  
    activityIndicator.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
  13.  
    activityIndicator.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor)
  14.  
    ])
  15.  
    }
  16.  
     
  17.  
    func presenActivity() {
  18.  
    activityIndicator.startAnimating()
  19.  
    }
  20.  
     
  21.  
    func dismissActivity() {
  22.  
    activityIndicator.stopAnimating()
  23.  
    }
  24.  
     
  25.  
    func present(_ error: Error) {
  26.  
    let alert = UIAlertController(title: error.localizedDescription, message: nil, preferredStyle: .alert)
  27.  
    alert.addAction(.init(title: "Cancel", style: .cancel))
  28.  
    present(alert, animated: true)
  29.  
    }
  30.  
    }
学新通

使用 protocol 拆

  1.  
    protocol ActivityPresentable {
  2.  
    func presentActivity()
  3.  
    func dismissActivity()
  4.  
    }
  5.  
     
  6.  
    extension ActivityPresentable where Self: UIViewController {
  7.  
    func presentActivity() {
  8.  
    if let activityIndicator = findActivity() {
  9.  
    activityIndicator.startAnimating()
  10.  
    } else {
  11.  
    let activityIndicator = UIActivityIndicatorView(style: .whiteLarge)
  12.  
    activityIndicator.startAnimating()
  13.  
    view.addSubview(activityIndicator)
  14.  
     
  15.  
    activityIndicator.translatesAutoresizingMaskIntoConstraints = false
  16.  
    NSLayoutConstraint.activate([
  17.  
    activityIndicator.centerXAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerXAnchor),
  18.  
    activityIndicator.centerYAnchor.constraint(equalTo: view.safeAreaLayoutGuide.centerYAnchor)
  19.  
    ])
  20.  
    }
  21.  
    }
  22.  
     
  23.  
    func dismissActivity() {
  24.  
    findActivity()?.stopAnimating()
  25.  
    }
  26.  
     
  27.  
    func findActivity() -> UIActivityIndicatorView? {
  28.  
    return view.subviews.compactMap { $0 as? UIActivityIndicatorView }.first
  29.  
    }
  30.  
    }
学新通

再来一个扩展

  1.  
    protocol ErrorPresentable {
  2.  
    func present(_ error: Error)
  3.  
    }
  4.  
     
  5.  
    extension ErrorPresentable where Self: UIViewController {
  6.  
    func present(_ error: Error) {
  7.  
    let alert = UIAlertController(title: error.localizedDescription, message: nil, preferredStyle: .alert)
  8.  
    alert.addAction(.init(title: "Cancel", style: .cancel))
  9.  
    present(alert, animated: true)
  10.  
    }
  11.  
    }

使用

  1.  
    class ViewController: UIViewController {
  2.  
    override func viewDidLoad() {
  3.  
    super.viewDidLoad()
  4.  
    presentActivity()
  5.  
    }
  6.  
    }
  7.  
     
  8.  
    extension ViewController: ActivityPresentable, ErrorPresentable {}

这种方法有另外一个好处,在某些的controller里,我们可以实现自定义的ActivityIndicator

  1.  
    class CustomViewController: UIViewController {
  2.  
    override func viewDidLoad() {
  3.  
    super.viewDidLoad()
  4.  
    presentActivity()
  5.  
    }
  6.  
    }
  7.  
     
  8.  
    extension CustomViewController: ActivityPresentable {
  9.  
    func presentActivity() {
  10.  
    // Custom activity presenting logic
  11.  
    }
  12.  
     
  13.  
    func dismissActivity() {
  14.  
     
  15.  
    }
  16.  
    }
学新通

参考

https://swiftwithmajid.com/2019/01/17/using-protocols-as-composable-extensions/

官方视频:

Protocol-Oriented Programming in Swift - WWDC15 - Videos - Apple Developer

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhibcfhf
系列文章
更多 icon
同类精品
更多 icon
继续加载