我从单一代码库管理了许多目标。对于每个目标,我都要设置一些属性,如主题颜色,标题名称等。我能够使用协议和Common类实现协议来实现这一点,该协议将值作为相应的目标返回。但这需要创建目标类类型的对象。我不想创建创建对象。我只想扩展协议,返回已为每个目标类静态设置的值。
以下是我的代码:
protocol AbstractProtocol {
func getServerUrl() -> String
}
返回默认值的公共类扩展协议
class AbstractClientFactory: AbstractProtocol
{
func getServerUrl() -> String
{
return "Default URL"
}
}
目标类扩展通用实现并按照
返回值class InspectClient1: AbstractClientFactory {
override func getServerUrl() -> String {
return "Target1 url value"
}
}
目标2级
class InspectClient2: AbstractClientFactory {
override func getServerUrl() -> String {
return "Target 2 url"
}
}
添加了一个在编译时返回客户端类型的桥接类
class AbstractClient
{
class func createAbstractClient() -> AbstractProtocol
{
return InspectClient1()
}
}
在ViewController中,我获得了目标网址
AbstractClient.createAbstractClient().getServerUrl()
我希望在不返回目标类型的对象的情况下实现此目的。这些是否可以通过在视图控制器中扩展协议来调用覆盖方法? 即 VC - >协议 - >首先调用默认实现的getUrl - >然后根据目标
调用InspectClient1 / InspectClient2覆盖getURl方法是否可以,不返回对象?
答案 0 :(得分:0)
您不需要协议。不同的目标可以具有不同的具有相同名称的类。 例如,您可以创建一个名为“常量”的类或文件或类似的东西。
class Constants { //target 1
let url = "target 1 url"
}
class Constants { //target 2
let url = "target 2 url"
}
然后从目标中的任何类调用url
属性。
您还可以创建具有相同名称的扩展协议(目标的每个扩展名)。
唯一的缺点是你需要将所有常量添加到所有目标,否则它们将无法构建。另一方面,您可以在编译时看到您缺少的内容并进行修复。
答案 1 :(得分:0)
有很多可能实现你想要的东西,但你需要做出一个决定 - 你想在运行时切换配置吗?例如。用于调试?
如果要在运行时切换配置,只需使用枚举:
enum MyTarget {
case test
case production
var url: String {
switch self {
case .test:
return "my test url"
case .production:
return "my production url"
}
}
和一个包含当前目标的全局变量:
var currentTarget: MyTarget = .test
更改此变量的值会在任何地方更改您的设置(可能您还应该触发更新UI的通知等)。
您的网址只能通过currentTarget.url
访问。
如果您不想在运行时切换配置,可以将配置参数包装到结构或类中:
#if MY_CONFIG_TEST
class Config {
static let url = "my test url"
}
#elif MY_CONFIG_PRODUCTION
class Config {
static let url = "my test url"
}
#endif
仅通过Config.url
访问您的网址。
不需要协议或抽象类,不需要单身。