【发布时间】:2015-04-22 19:46:13
【问题描述】:
Swift 的问题是有一种方法可以让枚举类型具有一个可以具有关联值的 case。
我有一个提供可用过滤器的 API,该 API 不太可能但可能会添加其他过滤器类型。因此,如果 API 发送未知的过滤器类型,我希望将该信息与枚举关联。
以下是我对这样做的不同想法。
我的前两次尝试没有编译。我的第三次尝试感觉有点笨拙。
有没有人有更好的方法来做到这一点?你认为我不应该使用枚举来解决这个问题吗?
typealias APIFilterIdentifier = String
/* Does Not Compile */
enum EnumTestAssociatedValeu: APIFilterIdentifier {
case Unknown(APIFilterIdentifier)
case Everyone = "everyone"
case Team = "myteam"
}
/* Does not compile */
enum EnumTestDefaultAssociatedValues: APIFilterIdentifier {
case Unknown(APIFilterIdentifier)
case Everyone(APIFilterIdentifier = "everyone")
case Team(APIFilterIdentifier = "myteam")
}
/* Compiles but is there a better way? */
enum EnumTestWithCustomInit {
case Unknown(APIFilterIdentifier)
case Everyone
case Team
init(filterIdentifier: APIFilterIdentifier) {
let everyone: APIFilterIdentifier = EnumTestWithCustomInit.everyoneFilterIdentifier
let team: APIFilterIdentifier = EnumTestWithCustomInit.teamFilterIdentifier
switch filterIdentifier {
case everyone:
self = .Everyone
case team:
self = .Team
default:
self = .Unknown(filterIdentifier)
}
}
func asIdentifer() -> APIFilterIdentifier {
switch self {
case .Everyone:
return EnumTestWithCustomInit.everyoneFilterIdentifier
case .Team:
return EnumTestWithCustomInit.teamFilterIdentifier
case .Unknown(let filterIdentifier):
return filterIdentifier
}
}
private static var everyoneFilterIdentifier: APIFilterIdentifier {
return "everyone"
}
private static var teamFilterIdentifier: APIFilterIdentifier {
return "myteam"
}
}
【问题讨论】:
-
如果有人能为这个问题取一个更好的标题,我会很高兴的。
-
我有同样的问题如何使用 Swift 枚举实现默认关联值?你找到答案了吗?谢谢
-
@Mariam 这在 Swift 1.2 中是不可能的。