我在快速删除命名空间方面存在问题
struct Constant {
static let loginAPI: String = "login"
static let signUpAPI: String = "signup"
}
class Network {
var api: String
init(api: String) {
self.api = api
}
}
var network = Network(api: Constant.loginAPI)
我只想使用Constant.loginAPI
,而不是使用.loginAPI
。
怎么可能?
答案 0 :(得分:2)
您可以改用enum
:
enum API: String {
case login = "login"
case signUp = "signup"
}
class Network {
let api: API
init(api: API) {
self.api = api
}
}
let network = Network(api: .login)
并且,当Network
需要字符串值时,可以使用api.rawValue
。或者,如果您真的不需要这些字符串,则可以进一步简化它:
enum API {
case login
case signUp
}
虽然我认为上面的enum
是尝试指定一系列预定值之一时的自然模式,但值得注意的是,您可以使用struct
来达到类似的目的:
struct API {
let value: String
static let login = API(value: "login")
static let signUp = API(value: "signup")
}
class Network {
var api: API
init(api: API) {
self.api = api
}
}
let network = Network(api: .login)
在这种情况下,Network
可以访问api.value
来检索字符串值。
但是,通过这种struct
方法,没有什么可以阻止某人做可能无效的事情,例如:
extension API {
static let foo = API(value: "bar")
}
let network = Network(api: .foo)
或者直接进行操作:
let network = Network(api: API(value: "baz"))
因此,如果动态添加值可能有意义,则仅使用此struct
模式。例如,在使用NotificationCenter
时,最好创建自己的Notification.Name
静态值,因为一个人可能同时发布和观察自己的自定义通知,但是您仍然可以使用方便的语法。
所有这些,在这种情况下,枚举是自然的解决方法。