Вы можете использовать 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
статические значения, потому что можно как публиковать, так и наблюдать собственные пользовательские уведомления, но вы все равно можете использовать удобный синтаксис.
Все сказанное в данном случае перечисление является естественным решением.