在swift3

时间:2017-02-08 06:07:15

标签: ios swift swift3 abstract-factory

我从单一代码库管理了许多目标。对于每个目标,我都要设置一些属性,如主题颜色,标题名称等。我能够使用协议和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方法

是否可以,不返回对象?

2 个答案:

答案 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访问您的网址。

不需要协议或抽象类,不需要单身。