Cannot call method of a protocol when any is used for type

50 Views Asked by At

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

0

There are 0 best solutions below