I was playing around with generics and implementing a sort-of Repository pattern that is moulded for our weird use case because the senior want it as-such
import Foundation
struct ReportingRepository {
func addSomething() {
let userDefaultsBuilder = UserDefaultsBuilder(key: "isDatasecured", value: true)
RepositoryMetadataLayer(storage: .UserDefaultsRepository).create(builder: userDefaultsBuilder)
}
}
struct RepositoryMetadataLayer<BuilderType: RepositoryBuilderType> {
let repositoryStorage: any RepositoryStorageType
init(storage: RepositoryStorages) {
repositoryStorage = storage.repositoryStorage
}
func create(builder: BuilderType) {
/// Error Here: Member 'create' cannot be used on value of type
/// 'any RepositoryStorageType'; consider using a generic constraint instead
_ = repositoryStorage.create(with: builder)
}
}
enum RepositoryStorages {
case CouchbaseRepository
case UserDefaultsRepository
case KeyChainRepository
case FileStorageRepository
var repositoryStorage: any RepositoryStorageType {
switch self {
case .CouchbaseRepository:
return CouchbaseRepositoryStorage()
case .UserDefaultsRepository:
return UserDefaultsRepositoryStorage()
case .KeyChainRepository, .FileStorageRepository:
return UserDefaultsRepositoryStorage()
}
}
}
protocol RepositoryBuilderType { }
struct CouchbaseRepositoryBuilder: RepositoryBuilderType {
let documentName: String
let data: Any
}
struct UserDefaultsBuilder: RepositoryBuilderType {
let key: String
let value: Any
}
protocol RepositoryStorageType {
associatedtype BuilderType: RepositoryBuilderType
func create(with builder: BuilderType) -> Result<Bool, RepositoryStorageError.Save>
}
enum RepositoryStorageError: Error {
enum Save: Error {
case CouchbaseInitialisationFailed
case UserDefaultsInitialisatonFailed
}
enum Fetch: Error {
case CouchbaseInitialisationFailed
}
enum Delete: Error {
case CouchbaseInitialisationFailed
}
}
struct UserDefaultsRepositoryStorage: RepositoryStorageType {
typealias BuilderType = UserDefaultsBuilder
func create(with builder: UserDefaultsBuilder) -> Result<Bool, RepositoryStorageError.Save> {
return .failure(.UserDefaultsInitialisatonFailed)
}
}
struct CouchbaseRepositoryStorage: RepositoryStorageType {
typealias BuilderType = CouchbaseRepositoryBuilder
func create(with builder: CouchbaseRepositoryBuilder) -> Result<Bool, RepositoryStorageError.Save> {
.failure(.UserDefaultsInitialisatonFailed)
}
}
I read about any and some keyword which lead me to use any instead of some as depicted in code. But when I want to call create method on RepositoryStorageType protocol's concrete implementation object, it won't let me