Swift黑科技:还在争论MVC和MVVM?博主独创幽灵架构MV!

本文介绍了博主原创的MV架构,一种基于Swift的轻量级解决方案,旨在解决数据源和视图源的异构性问题。通过面向协议编程,MV架构简化了数据绑定,避免了MVC的复杂性和MVVM的过度抽象。通过一个事件提醒应用的Demo,展示了如何使用MV架构处理不同数据类型的显示,以及如何在Swift中利用协议和泛型提高效率。MV架构使Model、View和Controller之间的交互更加简洁,提高了开发效率。
摘要由CSDN通过智能技术生成

本人原创,长文慎入,但此文可能会改写你的编程风格。我认为数据和模型交互的关键问题是如何处理数据源和视图源本身的异构性。通过面向协议编程的不断实践,总结他人的理论经验,我发现了使用两个极简的通用协议可以完美破解异构的问题,也就是本文想要介绍的MV架构。在最初版的版本中我想把这个架构命名为MVP(Model-View-Protocol),因为本文浏览的人比较多,这个命名容易和现有的MVP(Model-View-Presenter)造成混淆,但其实二者有着天壤之别,由于在本架构中Protocol部分的语法非常简短精炼,数据的处理分发给了Model和View本身,所以我觉得P可以去掉了,这个架构就叫MV,如幽灵般鬼魅。下面是原文内容:
WWDC2015已经过去一段时间了,我发现自从更新了Swift2.0到现在的Swift2.2,我只是跟着版本更新了所有需要更新的语法,依旧自以为是很熟练的Swift程序员。刚入职比较闲碰巧看到了1月份的中国首届Swift大会上大牛们的分享,突然陷入了思考,有了很多新想法又重温了几遍WWDC2015大会的视频,尤其是408和414号视频!!!我下定决心重构自己的代码,下面步入正题,结合Swift开发大会的一些分享,让我们谈谈架构。
通过一个简单的Demo:一个事件提醒的小应用。
这个应用会使用一个TableView混合展示一个时间段的所有待办事宜和这个时间段的节日提醒,由于待办事件和节日的数据构成是不同的,所以需要创建两个模型,它们在TableView上展示的样式也应该有所不同,很常规的我们还需要一个TableViewCell的子类。
现在数据工程里面的目录是这样的:
这里写图片描述

模型代码:

struct Event {
    var date = ""
    var eventTitle = ""
    init(date:String,title:String){
        self.date = date
        self.eventTitle = title
    }
}

struct Festival {
    var date = ""
    var festivalName = ""
    init(date:String,name:String){
        self.date = date
        self.festivalName = name
    }
}

为了简单我都使用了String类型的数据,至于为什么要使用struct而不使用class,大家可以参考WWDC2015的414号视频,讲的非常清楚,我自己的项目中的数据模型已经全部转成struct了,我会在后面专门写博文讲解struct,这里就不赘述了。这里需要啰嗦一下,注意创建的时候使用的是字面量的方法,而不是可选型,我一直认为使用字面量的方法是更好的选择,可选型很容易被当做语法糖滥用。尤其是数据的初始化中,你确定你真的需要一个空值?拿一个空值能做什么?做某种标志位么?请和你的后台开发人员商议,让他给你一个Bool类型的标志位,而不是一个空值。在可能的情况下,给你的数据模型的属性赋一个语义明确的字面量初始值,比如这里我们使用空字符串作为初始值。如果你的数据只是做展示的不会存在修改情况,你也可以使用如下的方法做初始化,以达到效率的最大化:

struct Event {
    let date:String
    let eventTitle:String
    init(date:String = "",eventTitle:String = ""){
        self.date = date
        self.eventTitle = eventTitle
    }
}

在Swift1.2版本之后,let定义的数据也支持延迟加载了,这里使用了默认参数值做非空的保障。
模型否则在创建一个实例的时候各种可选型的解包或可选绑定会让你吃尽苦头,空值的访问是程序carsh的元凶!
如果如果你更新了Xcode7.3,你会发现在创建一个属性的时候Xcode的提示是“ =“,没错,Xcode推荐你用字面量去做初始化。
有了数据模型后,在Cell上创建两个Label

class ShowedTableViewCell: UITableViewCell {
   
    //用来展示事件主题或节日名称的Label
    @IBOutlet weak var MixLabel: UILabel!
    //用来展示日期的Label
    @IBOutlet weak var dateLabel: UILabel!


}

MVC架构:
从这里我们将展示传统的MVC的写法,但是包含了一些关键的知识点,所以还是建议您不要跳过。我们通过控制器中的代码去控制数据的展示,由于数据源包含两种数据类型,可以构造两个数组避免数组的异构:

    var eventList = [Event]()
    var festivalList = [Festival]()
    let loadedEventList = [Event(date: "2月14", eventTitle: "送礼物")]
    let loadedFestivalList = [Festival(date: "1月1日", festivalName: "元旦"),Festival(date: "2月14", festivalName: "情人节")]

这里使用了struct的默认构造器构造对象,有两个节日提醒:元旦节和情人节,元旦节没什么事情做,情人节那天有个事件提醒”送礼物“,我们使用GCD去模拟数据刷新,整个控制器的代码如下:

import UIKit

let cellReusedID = "ShowedTableViewCell"
class ShowedTableViewController: UITableViewController {

    var eventList = [Event]()
    var festivalList = [Festival]()
    let loadedEventList = [Event(date: "2月14", eventTitle: "送礼物")]
    let loadedFestivalList = [Festival(date: "1月1日", festivalName: "元旦"),Festival(date: "2月14", festivalName: "情人节")]
    override func viewDidLoad() {
        super.viewDidLoad()
        let delayInSeconds = 2.0
        let popTime = dispatch_time(DISPATCH_TIME_NOW,
            Int64(delayInSeconds * Double(NSEC_PER_SEC)))
        dispatch_after(popTime, dispatch_get_main_queue()) { () -> Void in
            self.eventList &
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值