2016-01-25 2 views
0

Я бы хотел (статически) определить глобальный Swift typealias в соответствии с аргументами запуска.Определение быстрых типов в соответствии с аргументами запуска

Swift позволяет мне сделать это с константами:

protocol Client { 
} 
struct FakeAPIClient: Client { 
} 
struct ProductionAPIClient: Client { 
} 

private var isUITesting: Bool { 
    return NSProcessInfo.processInfo().arguments.contains("UI-TESTING") 
} 


let APIClient: Client.Type = isUITesting ? FakeAPIClient.self : ProductionAPIClient.self 

Как я могу достичь того же с typealiases? Я хотел бы сделать что-то вроде:

struct FakeAPIClient { 
} 
struct ProductionAPIClient { 
} 

private var isUITesting: Bool { 
    return NSProcessInfo.processInfo().arguments.contains("UI-TESTING") 
} 

typealias Client = isUITesting ? FakeAPIClient : ProductionAPIClient 

Но это не скомпилировано. Есть ли способ достичь этого?

+0

Разве вы не описываете общий? Конечно, детали будут зависеть от того, что вы хотите _do_ с этим динамически разрешенным типом. – matt

+0

просто вызывают статические методы, общие для 'ProductionAPIClient' и' FakeAPIClient'. может ли это быть сделано только с дженериками? – Eric

+0

У вас не может быть «статических» вещей, определенных во время выполнения. «Статический» означает, что он определен во время компиляции. В этом разница между статикой и динамикой. –

ответ

4

Вы не можете этого сделать. Алиас типа вычисляется во время компиляции, когда ваш проект построен, а то, что вы пытаетесь сделать, происходит во время выполнения. Во время выполнения все псевдонимы типов устанавливаются на место.

Для вашего потребительной случае тестирования пользовательского интерфейса, лучшим решением было бы использовать протоколы, и создать экземпляр объекта, который вы должны на основе запуска аргумента:

protocol ClientProtocol { 
} 

struct FakeAPIClient: ClientProtocol { 
} 

struct ProductionAPIClient: ClientProtocol { 
} 

func createClient() -> ClientProtocol { 
    return isUITesting ? FakeAPIClient() : ProductionAPIClient() 
} 

Вместо того, чтобы использовать тип псевдонима 'd используйте протокол, где бы вы ни находились в своем приложении.

Примечание.createClient - это так называемая заводская функция и может использоваться в нескольких сценариях, а не только для тестирования UI. Например, у вас может быть клиент API на основе AFNetworking и один на основе NSURLSession и легко переключаться между ними с простым изменением флага.

Смежные вопросы