Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何使泛型具有完成和结果类型工作?_Swift - Fatal编程技术网

Swift 如何使泛型具有完成和结果类型工作?

Swift 如何使泛型具有完成和结果类型工作?,swift,Swift,我目前正在为两个数据库API realm和Firestore编写数据库访问类。为了精简代码,我尝试用泛型1解决整个问题。不幸的是,它不起作用。我哪里没抓住要点 我尝试定义associatedtypes 2并在RealMacAccessStragy类中设置它们。但是在这一点上,如果试图通过PersistenceController访问协议,编译器将返回错误 我非常感谢你的帮助 方法1 枚举数据结果{ 案例成功者 案例失败错误 } 协议数据访问:AnyObject{ func readprimary

我目前正在为两个数据库API realm和Firestore编写数据库访问类。为了精简代码,我尝试用泛型1解决整个问题。不幸的是,它不起作用。我哪里没抓住要点

我尝试定义associatedtypes 2并在RealMacAccessStragy类中设置它们。但是在这一点上,如果试图通过PersistenceController访问协议,编译器将返回错误

我非常感谢你的帮助

方法1 枚举数据结果{ 案例成功者 案例失败错误 } 协议数据访问:AnyObject{ func readprimaryKey:U,完成:@escaping DataResult->Void } 类realmaccess策略{ ... func readprimaryKey:U,完成:@escaping DataResult->Void{ guard let realmObject=RealMinInstance.objectofType:realmObjectType,forPrimaryKey:primaryKey else{ completion.FailureRealMacAccessError.noObject 回来 } completion.successrealmObject//错误:“DataResult”中的成员“success”生成“DataResult”类型的结果,但上下文需要“DataResult” } } //后期实施 类持久性控制器{ 私有let策略:数据访问 inituse:dataapicaccess{ 自我策略=使用 } func loadprimaryKey:U,完成:@escaping DataResult->Void{ strategy.readprimaryKey:primaryKey,完成:完成 } } 不能设置变量通用协议,但可以设置方法

下面是示例代码

为基本结果创建枚举:

enum DataResult<T> {
    case success(T)
    case failure(Error)
}

享受吧

第一个问题是为什么在Swift已经有了结果类型的情况下定义DataResult。这是非常强大和酷,你会更高兴地使用它。是的,我知道。但在主要问题上没有什么区别。就我所知?谢谢你的支持。但我无法让它运行。func readprimaryKey:Int,completion:@escaping DataResult->Void{guard let realmObject=realmInstance.objectofType:realmObjectType,forPrimaryKey:primaryKey else{completion.failurerealmacceserror.noObject return}completion.successrealmObject}结果出错:“DataResult”中的成员“success”生成“DataResult”类型的结果,但上下文要求“DataResult”,您可以在swift中使用结果类
    ///Set a protocol generic methods:
    protocol DataApiAccess {
        func read<T: Codable>(primaryKey: PrimaryKeyType, completion: @escaping (DataResult<T>) -> Void)
    }

    class RealmAccessStrategy: DataApiAccess {

        func read<T: Codable>(primaryKey: PrimaryKeyType, completion: @escaping (DataResult<T>) -> Void) {
            // Read data from database
        }
    }

    class NetworkAccessStrategy: DataApiAccess {


        func read<T: Codable>(primaryKey: PrimaryKeyType, completion: @escaping (DataResult<T>) -> Void) {
             // Get data from request
        }
    }

    class PersistenceController {

        private let strategy: DataApiAccess

        init(use: DataApiAccess) {
            // Set dependency inversion for offline or online state
            self.strategy = use
        }

        func foo() {
             // TODO
            //strategy.read(primaryKey: <#T##PrimaryKeyType#>, completion: <#T##(DataResult<Decodable & Encodable>) -> Void#>)
        }


    }