首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据启动参数定义快速类型别名

根据启动参数定义快速类型别名
EN

Stack Overflow用户
提问于 2016-01-26 01:15:19
回答 1查看 314关注 0票数 0

我想(静态地)根据启动参数定义一个全局Swift typealias

Swift让我用常量做到这一点:

代码语言:javascript
运行
复制
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

我如何用类型别名实现同样的功能呢?我想做一些类似的事情:

代码语言:javascript
运行
复制
struct FakeAPIClient {
}
struct ProductionAPIClient {
}

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

typealias Client = isUITesting ? FakeAPIClient : ProductionAPIClient

但是这不能编译。有没有办法做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2016-01-26 01:25:45

您不能这样做。类型别名是在编译时计算的,当您的项目构建时,而您试图做的事情发生在运行时。在运行时,所有类型别名都设置到位。

对于UI测试的用例,更好的解决方案是使用协议,并基于启动参数实例化所需的对象:

代码语言:javascript
运行
复制
protocol ClientProtocol {
}

struct FakeAPIClient: ClientProtocol {
}

struct ProductionAPIClient: ClientProtocol {
}

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

您可以在应用程序中需要的任何地方使用协议,而不是使用类型别名。

注意: createClient是一个所谓的工厂函数,可以在多个场景中使用,而不仅仅是这个UI测试场景。例如,您可以有一个基于AFNetworking的API客户端和一个基于NSURLSession的API客户端,只需更改一个简单的标志,就可以在这两个客户端之间轻松切换。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34998351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档