diff --git a/Frameworks/Articles/Article.swift b/Frameworks/Articles/Article.swift index bee38db21..e748aa773 100644 --- a/Frameworks/Articles/Article.swift +++ b/Frameworks/Articles/Article.swift @@ -27,7 +27,6 @@ public struct Article: Hashable { public let authors: Set? public let attachments: Set? public let status: ArticleStatus - public let hashValue: Int public init(accountID: String, articleID: String?, feedID: String, uniqueID: String, title: String?, contentHTML: String?, contentText: String?, url: String?, externalURL: String?, summary: String?, imageURL: String?, bannerImageURL: String?, datePublished: Date?, dateModified: Date?, authors: Set?, attachments: Set?, status: ArticleStatus) { @@ -54,18 +53,25 @@ public struct Article: Hashable { else { self.articleID = Article.calculatedArticleID(feedID: feedID, uniqueID: uniqueID) } - - self.hashValue = (accountID + self.articleID).hashValue } public static func calculatedArticleID(feedID: String, uniqueID: String) -> String { return databaseIDWithString("\(feedID) \(uniqueID)") } - + + // MARK: - Hashable + + public func hash(into hasher: inout Hasher) { + hasher.combine(accountID) + hasher.combine(articleID) + } + + // MARK: - Equatable + public static func ==(lhs: Article, rhs: Article) -> Bool { - return lhs.hashValue == rhs.hashValue && lhs.articleID == rhs.articleID && lhs.accountID == rhs.accountID && lhs.feedID == rhs.feedID && lhs.uniqueID == rhs.uniqueID && lhs.title == rhs.title && lhs.contentHTML == rhs.contentHTML && lhs.url == rhs.url && lhs.externalURL == rhs.externalURL && lhs.summary == rhs.summary && lhs.imageURL == rhs.imageURL && lhs.bannerImageURL == rhs.bannerImageURL && lhs.datePublished == rhs.datePublished && lhs.authors == rhs.authors && lhs.attachments == rhs.attachments + return lhs.articleID == rhs.articleID && lhs.accountID == rhs.accountID && lhs.feedID == rhs.feedID && lhs.uniqueID == rhs.uniqueID && lhs.title == rhs.title && lhs.contentHTML == rhs.contentHTML && lhs.url == rhs.url && lhs.externalURL == rhs.externalURL && lhs.summary == rhs.summary && lhs.imageURL == rhs.imageURL && lhs.bannerImageURL == rhs.bannerImageURL && lhs.datePublished == rhs.datePublished && lhs.authors == rhs.authors && lhs.attachments == rhs.attachments } } diff --git a/Frameworks/Articles/ArticleStatus.swift b/Frameworks/Articles/ArticleStatus.swift index 6bdd03620..b41d7dc40 100644 --- a/Frameworks/Articles/ArticleStatus.swift +++ b/Frameworks/Articles/ArticleStatus.swift @@ -24,7 +24,6 @@ public final class ArticleStatus: Hashable { public let articleID: String public let dateArrived: Date - public let hashValue: Int public var read = false public var starred = false @@ -37,7 +36,6 @@ public final class ArticleStatus: Hashable { self.starred = starred self.userDeleted = userDeleted self.dateArrived = dateArrived - self.hashValue = articleID.hashValue } public convenience init(articleID: String, dateArrived: Date) { @@ -69,9 +67,17 @@ public final class ArticleStatus: Hashable { } } + // MARK: - Hashable + + public func hash(into hasher: inout Hasher) { + hasher.combine(articleID) + } + + // MARK: - Equatable + public static func ==(lhs: ArticleStatus, rhs: ArticleStatus) -> Bool { - return lhs.hashValue == rhs.hashValue && lhs.articleID == rhs.articleID && lhs.dateArrived == rhs.dateArrived && lhs.read == rhs.read && lhs.starred == rhs.starred && lhs.userDeleted == rhs.userDeleted + return lhs.articleID == rhs.articleID && lhs.dateArrived == rhs.dateArrived && lhs.read == rhs.read && lhs.starred == rhs.starred && lhs.userDeleted == rhs.userDeleted } } diff --git a/Frameworks/Articles/Attachment.swift b/Frameworks/Articles/Attachment.swift index 5e3f349ef..0909f38d6 100644 --- a/Frameworks/Articles/Attachment.swift +++ b/Frameworks/Articles/Attachment.swift @@ -16,7 +16,6 @@ public struct Attachment: Hashable { public let title: String? public let sizeInBytes: Int? public let durationInSeconds: Int? - public let hashValue: Int public init(attachmentID: String?, url: String, mimeType: String?, title: String?, sizeInBytes: Int?, durationInSeconds: Int?) { @@ -36,27 +35,33 @@ public struct Attachment: Hashable { self.durationInSeconds = nil } - var s = url - s += mimeType ?? "" - s += title ?? "" - if let sizeInBytes = sizeInBytes { - s += "\(sizeInBytes)" - } - if let durationInSeconds = durationInSeconds { - s += "\(durationInSeconds)" - } - self.hashValue = s.hashValue - if let attachmentID = attachmentID { self.attachmentID = attachmentID } else { + var s = url + s += mimeType ?? "" + s += title ?? "" + if let sizeInBytes = sizeInBytes { + s += "\(sizeInBytes)" + } + if let durationInSeconds = durationInSeconds { + s += "\(durationInSeconds)" + } self.attachmentID = databaseIDWithString(s) } } + // MARK: - Hashable + + public func hash(into hasher: inout Hasher) { + hasher.combine(attachmentID) + } + + // MARK: - Equatable + public static func ==(lhs: Attachment, rhs: Attachment) -> Bool { - return lhs.hashValue == rhs.hashValue && lhs.attachmentID == rhs.attachmentID + return lhs.attachmentID == rhs.attachmentID } } diff --git a/Frameworks/Articles/Author.swift b/Frameworks/Articles/Author.swift index 29118d679..a9d7f0ff3 100644 --- a/Frameworks/Articles/Author.swift +++ b/Frameworks/Articles/Author.swift @@ -15,7 +15,6 @@ public struct Author: Hashable { public let url: String? public let avatarURL: String? public let emailAddress: String? - public let hashValue: Int public init?(authorID: String?, name: String?, url: String?, avatarURL: String?, emailAddress: String?) { @@ -27,16 +26,14 @@ public struct Author: Hashable { self.avatarURL = avatarURL self.emailAddress = emailAddress - var s = name ?? "" - s += url ?? "" - s += avatarURL ?? "" - s += emailAddress ?? "" - self.hashValue = s.hashValue - if let authorID = authorID { self.authorID = authorID } else { + var s = name ?? "" + s += url ?? "" + s += avatarURL ?? "" + s += emailAddress ?? "" self.authorID = databaseIDWithString(s) } } @@ -76,16 +73,24 @@ public struct Author: Hashable { return d } - public static func ==(lhs: Author, rhs: Author) -> Bool { - - return lhs.hashValue == rhs.hashValue && lhs.authorID == rhs.authorID - } - public static func authorsWithDiskArray(_ diskArray: [[String: Any]]) -> Set? { let authors = diskArray.compactMap { Author(dictionary: $0) } return authors.isEmpty ? nil : Set(authors) } + + // MARK: - Hashable + + public func hash(into hasher: inout Hasher) { + hasher.combine(authorID) + } + + // MARK: - Equatable + + public static func ==(lhs: Author, rhs: Author) -> Bool { + + return lhs.authorID == rhs.authorID + } } extension Set where Element == Author {