Swift2编程之道:POP+MVVM
Swift2.0中引入了协议扩展的特性,并且建议开发者一切从协议(Protocol)出发,经过几个月的学习探索,博主发现Swift作为一门面向协议编程(POP)的语言非常适合时下火热的MVVM架构。MVVM已经提出有一段时间了,如果你还不懂什么是MVVM,建议先去补充相关的知识,再回到本文中。 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!~ protocol RenderContext{
func renderText(texts:String...)
func renderImage(images:UIImage...)
//func renderInt、renderDouble...
}
注意这里我们虽然只用到了String和UIImageView类型,但实际协议中的方法不需要局限于这两个类型,你可以通过协议扩展的规则来复用这个协议。 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模式,带来更多的分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |