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