这个问题是关于当您有多种类型的帖子时,为新闻源(如Twitter / Facebook /其他)存储一系列帖子的最佳方法。为简化起见,让我们考虑一种情况,当您有两种类型的帖子(每种帖子具有不同的单元格UI):“大”帖子(带有照片,文字...)和“小”帖子,其作用类似于通知。如果您想在UI元素(collectionView / tableView)中同时显示两种类型的帖子,那么方便地将它们都放置在“ posts”数组中,因此我们可以执行以下操作:
protocol Post {
var postID : String {get set}
var creatorID : String {get set}
var postType : PostType {get set} //<--- Custom enum that just has ".big" and ".small" in this case
//some other general things for the post may go here
}
struct BigPost : Post {
//All the post vars here
var postID : String
var creatorID : String
var postType : PostType = .big
//Some other things for this post type (just examples, they are not important)
var imageUrl : String
var countComments : Int
//etc
}
struct SmallPost : Post {
//All the post vars here
var postID : String
var creatorID : String
var postType : PostType = .small
//Some other things for this post type (just examples, they are not important)
var text : String
//etc
}
如果这样做,您实际上可以这样做
var posts : [Post] = [BigPost(), SmallPost(), SmallPost(), BigPost()]
而且它的工作原理是,您只需要使用“ postType”变量使每个帖子类型的对应单元格出队。我的问题是,这是一个好方法吗?因为我考虑过实现差异化(例如witch,例如deepDiff,它非常棒https://github.com/onmyway133/DeepDiff),所以当我们发布大量文章时,collectionView / tableView中的更新是高效的,但是那我该怎么办呢?因为我无法使Post协议符合某些其他“ Diffable”协议,因此无法声明类型为[Post]的数组,即使我同时将smallPost和bigPosts都遵守了该“ Diffable”协议,但编译器仍将“ post”数组中的元素视为“ Post”,因此无法执行任何“ diff”。
也许具有多态性的某些策略更好?你怎么看?
最佳答案
看看Type Casting-https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html
您可以使smallPost和bigPost符合“ Diffable”,创建数组
var posts : [Diffable] = [BigPost(), SmallPost(), SmallPost(), BigPost()]
然后检查它们的类型:
if let post = posts[0] as? SmallPost {
// do something
}
要么
if let post = posts[0] as? BigPost {
// do something
}
而且您不需要为此设置其他属性(var postType:PostType {获取设置})