Моделирование данных Post Feed в Swift - PullRequest
0 голосов
/ 20 сентября 2019

Этот вопрос о том, как лучше всего хранить массив сообщений для новостной ленты (например, Twitter / Facebook / что угодно), когда у вас есть несколько типов сообщений.Чтобы упростить ситуацию, давайте рассмотрим ситуацию, когда у вас есть 2 типа постов (каждый с различным пользовательским интерфейсом ячейки): «большой» пост (с фотографиями, текстом ...) и «небольшой» пост, который служит больше какуведомление.Если вы хотите представить оба вида постов в элементе пользовательского интерфейса (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" var.У меня вопрос, это хороший способ сделать это?Потому что я думал о реализации diffing (например, deepDiff, это потрясающе https://github.com/onmyway133/DeepDiff), поэтому обновление в collectionView / tableView эффективно, когда у нас много постов, но тогда, как мне это сделать?Это?Потому что я не могу заставить свой Post-протокол соответствовать какому-то другому протоколу «Diffable», потому что тогда я не смог бы объявить массив типа [Post], и даже если бы я сделал так, smallPost и bigPosts, соответствовал этому «Diffable» протоколуЯ, элементы в массиве "post" по-прежнему обрабатываются компилятором как "Post", поэтому я не смог выполнить "diff".

Может быть, какая-нибудь стратегия с полиморфизмом лучше?Что ты думаешь?

1 Ответ

0 голосов
/ 20 сентября 2019

Посмотрите на тип 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 {get set})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...