From 6bdd32628c2ad80a8d4b0d3fcc0834cf34bb32fc Mon Sep 17 00:00:00 2001 From: jahorton Date: Fri, 12 Jun 2020 09:04:26 +0700 Subject: [PATCH] refactor(ios/engine): resource FullIDs now equatable at protocol level --- .../KMEI/KeymanEngine/Classes/Model/FullKeyboardID.swift | 9 +-------- .../KeymanEngine/Classes/Model/FullLexicalModelID.swift | 9 +-------- .../KeymanEngine/Classes/Model/LanguageResource.swift | 9 ++++++++- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Model/FullKeyboardID.swift b/ios/engine/KMEI/KeymanEngine/Classes/Model/FullKeyboardID.swift index 9af399d617..c67306fe72 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Model/FullKeyboardID.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Model/FullKeyboardID.swift @@ -9,7 +9,7 @@ import Foundation /// A complete identifier for an `InstallableKeyboard`. Keyboards must have unique `FullKeyboardID`s. -public struct FullKeyboardID: Codable, LanguageResourceFullID { +public struct FullKeyboardID: Codable, LanguageResourceFullID, Equatable { public var keyboardID: String public var languageID: String @@ -22,13 +22,6 @@ public struct FullKeyboardID: Codable, LanguageResourceFullID { } } -// MARK: - Equatable -extension FullKeyboardID: Equatable { - public static func ==(lhs: FullKeyboardID, rhs: FullKeyboardID) -> Bool { - return lhs.keyboardID == rhs.keyboardID && lhs.languageID == rhs.languageID - } -} - // MARK: - CustomStringConvertible extension FullKeyboardID: CustomStringConvertible { public var description: String { diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Model/FullLexicalModelID.swift b/ios/engine/KMEI/KeymanEngine/Classes/Model/FullLexicalModelID.swift index cf36dd1440..2117973ada 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Model/FullLexicalModelID.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Model/FullLexicalModelID.swift @@ -9,7 +9,7 @@ import Foundation /// A complete identifier for an `InstallableLexicalModel`. LexicalModels must have unique `FullLexicalModelID`s. -public struct FullLexicalModelID: Codable, LanguageResourceFullID { +public struct FullLexicalModelID: Codable, LanguageResourceFullID, Equatable { public var lexicalModelID: String public var languageID: String @@ -22,13 +22,6 @@ public struct FullLexicalModelID: Codable, LanguageResourceFullID { } } -// MARK: - Equatable -extension FullLexicalModelID: Equatable { - public static func ==(lhs: FullLexicalModelID, rhs: FullLexicalModelID) -> Bool { - return lhs.lexicalModelID == rhs.lexicalModelID && lhs.languageID == rhs.languageID - } -} - // MARK: - CustomStringConvertible extension FullLexicalModelID: CustomStringConvertible { public var description: String { diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Model/LanguageResource.swift b/ios/engine/KMEI/KeymanEngine/Classes/Model/LanguageResource.swift index 940fc72d82..a1de718954 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Model/LanguageResource.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Model/LanguageResource.swift @@ -12,12 +12,19 @@ public enum LanguageResourceType { case keyboard, lexicalModel } +// Subclasses must implement Equatable; Swift doesn't like it directly on the root protocol. public protocol LanguageResourceFullID { var id: String { get } var languageID: String { get } var type: LanguageResourceType { get } } +extension LanguageResourceFullID where Self: Equatable { + public static func ==(lhs: Self, rhs: Self) -> Bool { + return lhs.id == rhs.id && lhs.languageID == rhs.languageID && lhs.type == rhs.type + } +} + // Alas, 'associatedtype' stuff isn't exactly generic, and it's impossible to wildcard. // So, this supports Swift's "type erasure" pattern, acting as a "wildcarded" // LanguageResource that doesn't care about the specific associatedtype(s) that @@ -41,7 +48,7 @@ public protocol AnyLanguageResource { // Necessary due to Swift details 'documented' at // https://stackoverflow.com/questions/42561685/why-cant-a-get-only-property-requirement-in-a-protocol-be-satisfied-by-a-proper public protocol LanguageResource: AnyLanguageResource { - associatedtype FullID: LanguageResourceFullID + associatedtype FullID: LanguageResourceFullID where FullID: Equatable var typedFullID: FullID { get } }