gpt4 book ai didi

swift - 如何在 Swift 中使用泛型正确实现提供者逻辑

转载 作者:行者123 更新时间:2023-11-30 10:47:32 24 4
gpt4 key购买 nike

我尝试实现一些不同的对象可以接收其独特配置的逻辑。

我有很多不同类型的对象,它们可以请求自己的配置对象。

//Provider
protocol ConfigProvider {
func config<R: ConfigReciever>(for reciever: R) -> R.ConfigType
}

class Factory {

}

extension Factory: ConfigProvider {
func config<R: ConfigReciever>(for reciever: R) -> R.ConfigType {
//How switch?
return Config1(info: "hey") as! R.ConfigType
}
}

//Reciever
protocol ConfigReciever: class {
associatedtype ConfigType
var dataSource: ConfigProvider? { get set }
}

struct Config1 {
let info: String
}

class Object1: ConfigReciever {
typealias ConfigType = Config1
var dataSource: ConfigProvider?

func execute() {
let config = dataSource?.config(for: self)
print("\(config!.info)")
}
}

但是正确实现 Provider 逻辑存在一些问题。我不知道如何切换接收器来创建正确的配置类型。有这个选项吗?

我知道,我可以在没有泛型的情况下完成此操作(例如使用 configTypes 枚举),但我不想进行不必要的转换。

最佳答案

我建议使用中间协议(protocol)

// Wrapper container
protocol Container { }

extension String: Container { }
extension Int: Container { }

// Implementation

//Provider
protocol ConfigProvider {
func config<R>(for reciever: R) -> Configuration where R : ConfigReciever, R.ConfigType: Configuration
}

class Factory { }

extension Factory: ConfigProvider {
func config<R>(for reciever: R) -> Configuration where R : ConfigReciever, R.ConfigType: Configuration {
return Config1(info: "hey")
}
}

//Reciever
protocol ConfigReciever: class {
associatedtype ConfigType
var dataSource: ConfigProvider? { get set }
}

protocol Configuration {
var info: Container { get set }
}

struct Config1: Configuration {
var info: String
}

class Object1: ConfigReciever {
typealias ConfigType = Config1
var dataSource: ConfigProvider?

func execute() {
let config = dataSource?.config(for: self)
// here you should case into wanted structure:
if let stringInfo = config?.info as? String {
print("\(stringInfo)")
}
}
}

let factory = Factory()
let obj = Object1()

obj.dataSource = factory

obj.execute()

关于swift - 如何在 Swift 中使用泛型正确实现提供者逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55451366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com