这个问题是关于当您有多种类型的帖子时,为新闻源(如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 {获取设置})

10-06 02:54