Этот вопрос о том, как лучше всего хранить массив сообщений для новостной ленты (например, 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".
Может быть, какая-нибудь стратегия с полиморфизмом лучше?Что ты думаешь?