【问题标题】:Swift appending to an array with custom objects and sorting themSwift 将自定义对象附加到数组并对其进行排序
【发布时间】:2018-11-05 00:54:54
【问题描述】:

我正在制作一个收藏视图,向某人显示他们的“供稿”,其中包括他们的赞美、喜欢、回复和发送。我有一个名为 Feed 的对象,它由一组赞美、一组喜欢、一组回复和一组发送组成。这些较小数组中的每个对象都有一个 date_created 属性。

我知道如何根据一个按日期排序的数组填充集合视图,但是如何根据发送日期从四个数组加载每个喜欢、回复、赞美和发送的集合视图?

我是否可能将这些对象中的每一个都附加到一个数组中?如果是这样,我该如何遍历该数组并对其中的所有内容进行排序?

struct Feed: Decodable {
    let likes: [Like]
    let replies: [Reply]
    let compliments: [Compliment]
    let sent: [Compliment]
}

struct Like: Decodable {
    let id: Int
    let user: QuickUser
    let created_at: String
}

struct Reply: Decodable {
    let parent: Compliment
    let content: String
    let created_at: String
}

struct Compliment: Decodable {
    let id: Int
    let content: String
    let sender: QuickUser

    let created_at: String

    let is_liked: Bool
    let recipient: QuickUser
    let is_public: Bool
}

func getFeed() {
    UserServices.getInboxFeed { feed in
        guard let feed = feed else {
            self.showOkayAlert(title: "Oops!", message: "We are having trouble loading your inbox.", completion: nil)
            return
        }
        self.feed = feed

        DispatchQueue.main.async {
            //load collection view here
        }
    }
}

集合视图的样机

【问题讨论】:

  • created_at,这不应该是日期吗?

标签: arrays swift sorting custom-object


【解决方案1】:

好吧,为了解决这个问题,我制作了一个虚拟协议,其中包含它们共享的共享属性。

在这种情况下是created_at,我认为这应该是日期格式。

不过,下一步是扩展 Feed,其中包含 function

返回与我调用的虚拟protocol 确认的最新对象,它是LatestAction

它基本上按date 对每个数组进行排序并返回第一项。

在我们的例子中是最新的date

然后创建一个[LatestAction] 以同样的方式再次对其进行排序并返回第一个项目,即LatestAction

观察下面的代码。

struct QuickUser: Codable {

}

struct Feed: Decodable {
    let likes: [Like]
    let replies: [Reply]
    let compliments: [Compliment]
    let sent: [Compliment]
}
extension Feed {
    func latestAction() -> LatestAction {
        let latestLike = self.likes.sorted(by: { $0.created_at.compare($1.created_at) == .orderedDescending }).first!
        let latestReply = self.replies.sorted(by: { $0.created_at.compare($1.created_at) == .orderedDescending }).first!
        let latestComp = self.compliments.sorted(by: { $0.created_at.compare($1.created_at) == .orderedDescending }).first!
        let latestActions: [LatestAction] = [latestReply, latestLike, latestComp].sorted(by: { $0.created_at.compare($1.created_at) == .orderedDescending })
        return latestActions.first!
    }

}
protocol LatestAction  {
    var created_at: Date { get }
}

struct Like: Decodable, LatestAction {

    let id: Int
    let user: QuickUser
    let created_at: Date
}

struct Reply: Decodable, LatestAction {

    let parent: Compliment
    let content: String
    let created_at: Date
}

struct Compliment: Decodable, LatestAction {

    let id: Int
    let content: String
    let sender: QuickUser

    let created_at: Date

    let is_liked: Bool
    let recipient: QuickUser
    let is_public: Bool
}



// Simply used like this
var latest = feed.latestAction() 

如果您检查了latest 类型,我们还没有完成,它会说LatestAction,并且只能访问其中的一个属性,即created_at

现在是最后一部分,我们要去TypeCastObject

if let latest = feed.latestAction() as? Like {
    // used as Like
} else if let latest = feed.latestAction() as? Compliment {
    // used as Compliment
} else if let latest = feed.latestAction() as? Reply {
    // used as reply
}

【讨论】:

  • 在你的问题中 created_at 是一个 String 类型,考虑到这应该是一个日期,但是如果它不是 you 。可以将字符串转换为日期检查有关如何实现的其他问题,然后您可以使用这个简单的扩展和方法。
  • 太棒了!但是,您似乎只能找到所有类别中的最新类别。我需要能够加载一个集合视图,所有这些视图都按日期排序。实际上我只是想出了一个解决方法,因为我创建了一个数组,其中仅包含每个数组的显示信息,该数组由相同的数据组成,然后使用该数组对集合视图进行排序,并存储它们对应的索引,如果我需要额外的信息。但是,我认为你有一个更好的解决方案,假设它可以做我提到的
  • 删除 .first 并对所有结果进行排序
  • 它解决了我认为你需要的东西,如果你编辑一下你可以更多地使用它
  • 我会测试它,我现在将它标记为正确答案,如果有任何问题我会告诉你。我真的很感激时间和精力!祝你有美好的一天
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多