• Swift2编程之道:POP+MVVM 2016-03-01 00:38:54
    Swift2.0中引入了协议扩展的特性,并且建议开发者一切从协议(Protocol)出发,经过几个月的学习探索,博主发现Swift作为一门面向协议编程(POP)的语言非常适合时下火热的MVVM架构。MVVM已经提出有一段时间了,如果...
    Swift2.0中引入了协议扩展的特性,并且建议开发者一切从协议(Protocol)出发,经过几个月的学习探索,博主发现Swift作为一门面向协议编程(POP)的语言非常适合时下火热的MVVM架构。MVVM已经提出有一段时间了,如果你还不懂什么是MVVM,建议先去补充相关的知识,再回到本文中。
    在Cocoa Touch体系内,MVC是广为人知的经典架构,博主之前也讲解过MVC的相关知识,但是随着业务逻辑的扩张,控制器中的代码可能会变得非常庞大导致难以维护,因为无论是OC还是Swift都是单类继承,这就使得类的世界总是处于一个垂直的继承链中。
    而在2.0版本之前的Swift版本中,协议中的成员无法进行初始化,只存在一个声明,这就造成了代码复用上的困难。好在Swift2.0中引入的协议扩展,使得协议可以通过扩展的方法赋予默认的实现,并且通过where语法为不同的协议组合赋予不同的初始格式,controller可以通过简单的遵循某个协议,而获得协议中定义好的方法,直接使用,大大缓解了控制器的压力,不会造成臃肿的继承关系。
    另外虽然MVC中的view和controller应该是松散的,但在实际开发中我们都知道,view和controller的结合非常紧密,大量处理view的代码都会写在controller中,会对Debug的定位造成一定的困扰。
    基于以上的问题,为针对iOS代码解耦和的MVVM框架日渐火热,结合Swift2.0中的协议扩展特性可以写出非常悦目的代码。具体请看下面的示例,在一个非常常见的商品展示的TableView中,传统的做法大抵如下:
    你需要一个继承一个TableViewCell的基类,然后在storyboard中设计好你的页面,再把页面与代码的元素关联起来:
    
    ```
    class ShowedTableViewCell: UITableViewCell {
    
        @IBOutlet weak var showedImage: UIImageView!
        @IBOutlet weak var NameLabel: UILabel!
        @IBOutlet weak var priceLabel: UILabel!
        func configCell(showedImageView:UIImageView,Name:String,price:String){...}
        ...
    }
    ```
    而工程中商品对应的数据模型(Modal)中保存了商品信息的数据结构,名称、价格、第三方平台上保存的图片地址等等。
    
    ```
    class Something {
        var name:String?
        var price:String?
        var imageViewURL:String?
    }
    ```
    这些信息需要提供给Cell做展示,此时你会发现定义完数据结构之后似乎就没Modal啥事了,你会打开熟悉的Controller代码,在里面关联一张tableview,运用封装的网络通信方法获取Modal中需要的信息,保存在controller中的临时数组[Something]中,最后筛选出相应的信息在tableview的datasource方法和delegate中运用传递。这一切似乎顺理成章,但是如果你的controller对应的是某个商城的首页,首页中除了tableview可能还有navigation、slider、collectionView等等,那么你的controller代码会变得非常臃肿,Boooom!~
    上面的示例运用POP+MVVM是这样的:
    1.首先编写一个用来传递数据的协议,这个协议中的方法按照需要传递的数据类型来命名,参数为可变参数,本例中的代码如下:
    
    ```
    protocol RenderContext{
        func renderText(texts:String...)
        func renderImage(images:UIImage...)
        //func renderInt、renderDouble...
    }
    ```
    注意这里我们虽然只用到了String和UIImageView类型,但实际协议中的方法不需要局限于这两个类型,你可以通过协议扩展的规则来复用这个协议。
    2.定义反向的数据传递:
    
    ```
    protocol ViewModal{
        func contextInRender(context:RenderContext)
    }
    ```
    3.在相应的场合中扩展上面的协议,使得协议中的方法获得实现:
    
    ```
    extension ShowedTableViewCell:RenderContext{
        func renderText(texts: String...) {
            NameLabel?.text = texts.first
            priceLabel?.text = texts.last
        }
        func renderImage(images: UIImage...) {
            showedImage.image = images.first
        }
    }
    ```
    
    ```
    extension Something:ViewModal{
        func contextInRender(context: RenderContext) {
            context.renderText(name!,price!)
            context.renderImage(UIImage(data: NSData(contentsOfURL: NSURL(string: imageViewURL!)!)!)!)
            
        }
    }
    ```
    View和Modal彼此通过两个协议进行交互,这个写法的灵感来自2016Swift大会上做分享的大神傅若愚,没有引入新的代码层次,博主会在新的工程中继续实践这种新的MVVM模式,带来更多的分享。
    
    
    展开全文
  • WWDC2015已经过去一段时间了,我发现自从更新了Swift2.0到现在的Swift2.2,我只是跟着版本更新了所有需要更新的语法,依旧自以为是很熟练的Swift程序员。刚入职比较闲碰巧看到了1月份的中国首届Swift大会上大牛们的...
  • MVVM是微软提出一种移动开发框架,旨在针对传统的MVC框架,解决传统的MVC框架的控制器的臃肿问题. M: Model模型,也就是数据模型;比如一条微博,对应的所有字段合成一条微博整体,这个整体就是Model V: ...
  • Swift 路由机制设计 2017-07-01 08:06:04
    APP设计模式多种多样,从最初的MVC到MVVM,再到MVP,VIPER等。越来越多的设计模式被开发出来并得以应用,但不论我们用到哪种设计模式,只需要记住高内聚、低耦合那边是好的设计模式。在这里笔者整理了一份demo以帮助...
  • Swift-MVVM 简单演练(一) 2019-06-11 16:06:19
    Swift-MVVM 简单演练(二) Swift-MVVM 简单演练(三) Swift-MVVM 简单演练(四) 前言 最近在学习swiftMVVM架构模式,目的只是将自己的学习笔记记录下来,方便自己日后查找,仅此而已!!! 如果有任何问题,欢迎和我...
  • 由于没有历史包袱,且团队愿意尝试一些不同的方案,经过两周专注的学习和调研之后,我们并没有采用主流的 MVVM 架构,而是基于 ReSwift 以及 Swift 这门语言的特性(核心是 extension)构建了一套类似 Vue + Vuex 的...
  • 实际使用 protocol(就是c#中的interface),将页面1的viewcontroller转换为protocol传入页面2的viewcontroller,非常类似于我们在c#中开发将_viewController转成接口传入其他...在swift里面这种做法叫委托,c#中...
  • ios swift 学习 2015-04-14 13:37:43
      ...[置顶] Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS/android app 2015-04-09 14:20 阅读(77) 评论(0)   [置顶] Swift教程16-使用Swift调用AFNetw
  • swift问题集--未完待续 2019-07-03 13:47:08
    由于 swift 是一个静态语言, 所以没有 Objective-C 中的消息发送这些动态机制, dynamic 的作用就是让 swift 代码也能有 Objective-C 中的动态机制, 常用的地方就是 KVO 了, 如果要监控一个属性, 则必须要标记为 ...
  • OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定、动态加载等)。总体来讲,OC确实是一门不错的编程...
  • swift笔记 2020-02-04 10:11:11
    Swift5.1 https://docs.swift.org/swift-book/LanguageGuide/Subscripts.html 1、swift没有隐式转化 Swift中没有隐式转化,不会将整形自动转成浮点型 let m = 32 let n = 3.14 let result = m + n 错误写法 ...
  • 前几篇博文对“幽灵架构”做了用法的介绍和相关技术点的补充,本文是一篇总结性质的文章,分析该架构的适用场景和限制,首先让我们回顾一下iOS开发的MVC模式,参考斯坦福公开课里Paul老爷子的讲解,如下图所示: ...
  • iOS进阶 - 如何制定一套适合自己团队的 iOS 编码规范? 统一的编码规范,能有限的避免团队成员由于代码风格不一致而导致的相互认同感缺失的问题。 好的代码规范,需要从如下八个方面进行约束:常量、变量、属性、...
  • 这篇文章本来是繁体中文的,我把它转成简体放在这里。...前言历时将近6年的时间来制定的新ECMAScript标准ECMAScript 6(亦称ECMAScript Harmony,简称ES6)终于在2015年6月正式发布。自从上一个标准版本ES5在2009年发布...
  • 需求一:将字典转换成自己需的对象,对象的属性是字典的key值,直接使用key值获取...使用模型的优点还在于存储、传值都比较方便,不容易出错。最主要的是这也符合我们MVC和MVVM的设计模式。 注意:要使用模型就离...
  • 第一波: 1.jpg 自答: 说实话,刚刚看到这套面试题,我觉得还是很难的,这是要招聘大牛的...相信有过swift/C#开发经验的,或者其他编程经验的,只要不是OC,一看就知道。 通过一个小例子来解释. 看两行代码: ...
1 2 3 4 5 6
收藏数 112
精华内容 44