比较 Swift 中的枚举
Compare enums in Swift
我有一个 class 包含两个像这样的枚举(简单):
class Errors {
enum UserError: String {
case NoToken = "No token!"
case NoPassword = "No password!"
}
enum BackendError: String {
case NoConnection = "No connection!"
case ServerBusy = "Server is busy!"
}
}
现在我想编写一个通用函数,它根据输入接受 UserError 或 BackendError 和 return 字符串。像这样:
func alert(type: /* Accepts Error.UserError or BackendError*/) -> String {
// checks if UserError or BackendError and returns .rawValue
}
我的第一个方法是使用泛型——但坦率地说,我在理解这个概念时遇到了困难,而且我倾向于认为我在这里从根本上是错误的。我所做的是:
func alert<T>(type: T) {
if type == Errors.UserError {
return Errors.UserError.NoPassword.rawValue
} else {
return Errors.BackendError.NoConnection.rawValue
}
}
显然,这是行不通的。
binary operator cannot be applied to operands of type 'T' and 'Errors.UserError.Type'
我知道这与缺少实现 Equatable/Comparable 协议以及我对使用泛型缺乏理解有关。我的问题是:
如何将我的通用 "type" 参数与我的枚举进行比较?
我对泛型的理解完全错误吗?
另外:我想避免 AnyObject
方法。
你的 enums
的共同点和你想利用的是他们 RawRepresentable
他们的 RawValue
类型是 String
.
所以你需要一个像这样的函数:
func alert<T: RawRepresentable where T.RawValue == String>(t: T) -> String {
return t.rawValue
}
希望我没有误解你的目的。我假设你想要一个通用函数可以接受任一枚举也打印出每个自己的字符串。也许你可以把我的回答作为参考。
函数:
func alert<T: CustomStringConvertible>(t: T) -> String {
return t.description
}
枚举:
enum UserError: String, CustomStringConvertible {
case NoToken = "No token!"
case NoPassword = "No password!"
var description: String {
return self.rawValue
}
}
enum BackendError: String, CustomStringConvertible {
case NoConnection = "No connection!"
case ServerBusy = "Server is busy!"
var description: String {
return self.rawValue
}
}
我有一个 class 包含两个像这样的枚举(简单):
class Errors {
enum UserError: String {
case NoToken = "No token!"
case NoPassword = "No password!"
}
enum BackendError: String {
case NoConnection = "No connection!"
case ServerBusy = "Server is busy!"
}
}
现在我想编写一个通用函数,它根据输入接受 UserError 或 BackendError 和 return 字符串。像这样:
func alert(type: /* Accepts Error.UserError or BackendError*/) -> String {
// checks if UserError or BackendError and returns .rawValue
}
我的第一个方法是使用泛型——但坦率地说,我在理解这个概念时遇到了困难,而且我倾向于认为我在这里从根本上是错误的。我所做的是:
func alert<T>(type: T) {
if type == Errors.UserError {
return Errors.UserError.NoPassword.rawValue
} else {
return Errors.BackendError.NoConnection.rawValue
}
}
显然,这是行不通的。
binary operator cannot be applied to operands of type 'T' and 'Errors.UserError.Type'
我知道这与缺少实现 Equatable/Comparable 协议以及我对使用泛型缺乏理解有关。我的问题是:
如何将我的通用 "type" 参数与我的枚举进行比较?
我对泛型的理解完全错误吗?
另外:我想避免 AnyObject
方法。
你的 enums
的共同点和你想利用的是他们 RawRepresentable
他们的 RawValue
类型是 String
.
所以你需要一个像这样的函数:
func alert<T: RawRepresentable where T.RawValue == String>(t: T) -> String {
return t.rawValue
}
希望我没有误解你的目的。我假设你想要一个通用函数可以接受任一枚举也打印出每个自己的字符串。也许你可以把我的回答作为参考。
函数:
func alert<T: CustomStringConvertible>(t: T) -> String {
return t.description
}
枚举:
enum UserError: String, CustomStringConvertible {
case NoToken = "No token!"
case NoPassword = "No password!"
var description: String {
return self.rawValue
}
}
enum BackendError: String, CustomStringConvertible {
case NoConnection = "No connection!"
case ServerBusy = "Server is busy!"
var description: String {
return self.rawValue
}
}