Swift POP 应用 (一) UITableViewCell 的注册与获取
最近在学习 Swift 中协议的使用。 在上一篇聊到 Swift 中 POP 的优势之后, 由于参加了 SwiftGG 举办的 Swift 开发者大会, 听了 Anddy Hope 在项目 neno 上介绍新的代码组织方式。 但是主题之外,看到了一起其它不错的地方。
重构Massive AppDelegate
本文是翻译自墙外的一片文章。文章通过分析iOS项目中 AppDelegate
中常负担的职能,并将其分为三类,通过引入不同的设计模式将代码进行抽离整合,最终达到单一职能、可重用、易测试的特点。
译者也在文章的影响下,对当前进行的项目进行了相应的兼容和实现,最终效果还是很不错的。
对于首页的优化
当前页面中存在的问题
switch model.style {
case .news:
let cell = tableView.dequeue("newsCell") //config
//...配置
return cell
case .video:
let cell = tableView.dequeue("videosCell") //config
//...配置
return cell
case .pic:
let cell = tableView.dequeue("picsCell") //config
//...配置
return cell
case .beauty:
let cell = tableView.dequeue("beautyCell") //config
//...配置
return cell
case .bigImage:
let cell = tableView.dequeue("bigImageCell") //config
//...配置
return cell
default: ...
}
实际页面涉及到的cell种类不止这些,并且在未来的开发过程中会随着app特性的增加而增长,因为每次需要维护和更新时对整个大的代码块进行修改就编程一个非常杂乱的过程,稍有不慎还会影响整体的逻辑。那这里我们需要利用协议的特性进行设计。相关参考
实际项目中定义了一个协议,用来表示整个的数据类型
protocol ParseMessageType{
associatetype: Original
associatetype: ParseResult
}
那Original
->ParseResult
的转换步骤通过一个 parser来完成, 叫做MessageParser
protocol MessageParser {
associatetype: Message
associatetype: Target: ParaseMessageType where Message == Target.Original
func parse(messgae: Message)-> Target.ParsedResult
}
对于Target遵守 ParaseMessageType 的协议, 并且它的 original和message一致, 这就对parse方法的返回值进行了限定,编译过程中进行类型检查时会进行严格的类型匹配。
在具体MessageType实现的过程中
final class ParsedChatMessage: ParsedMessageType {
let output: NSAttributedString
let original: ChatMessage
init(message: ChatMessage){
original = messgae
let parser = Parser()
self.output = parser.parse(message: message)
}
}
struct Parser: MessageParser {
typealias Target = ParsedChatMessage
func parse(message: ChatMeaasge)-> NSAttributeString {
let reuslt = ...
return .init(attributedString: result...)
}
}
那么实际中的本地效果呢:
FeedModel IndexProtocol cellViewModel1 cellViewModel2cellViewModel3
在 feedModel,
在feedModel中实现fakeModel
FeedModel-> IndexProtocol
fakeModel-> IndexProtocol
TopicModel -> IndexProtocol
对应的不同的cell,
此外,需要进一步实践的
Copyright © 2015 Powered by MWeb, Theme used GitHub CSS.