快速省略名称空间

时间:2019-03-20 23:45:18

标签: swift

我在快速删除命名空间方面存在问题

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。 怎么可能?

1 个答案:

答案 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静态值,因为一个人可能同时发布和观察自己的自定义通知,但是您仍然可以使用方便的语法。

所有这些,在这种情况下,枚举是自然的解决方法。