首页 > 解决方案 > 快速省略命名空间

问题描述

我有一个问题要在 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. 这怎么可能?

标签: swift

解决方案


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

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


推荐阅读