如何使用Swift枚举实现默认关联值? [英] How should I implement Default Associated Values with Swift Enums?
问题描述
我有一个API给我可用的过滤器,它是不太可能,API可能会添加额外的过滤器类型。因此,如果API发送一个未知的过滤器类型,我想保留与枚举相关的信息。
以下是我对此的不同想法。
我的前两个尝试没有编译。我的第三个尝试只是觉得有点笨重。
有没有人有更好的方式这样做?你认为我不应该使用这个问题的枚举?
typealias APIFilterIdentifier = String
/ *不编译* /
枚举EnumTestAssociatedValeu:APIFilterIdentifier {
case Unknown(APIFilterIdentifier)
case Everyone =everyone
case Team =myteam
/ *不编译* /
枚举EnumTestDefaultAssociatedValues:APIFilterIdentifier {
case Unknown(APIFilterIdentifier)
case Everyone(APIFilterIdentifier =everyone)
case Team(APIFilterIdentifier =myteam)
}
/ *编译但是有更好的方法吗? * /
枚举EnumTestWithCustomInit {
case Unknown(APIFilterIdentifier)
case Everyone
case Team
init(filterIdentifier:APIFilterIdentifier){
让大家:APIFilterIdentifier = EnumTestWithCustomInit.everyoneFilterIdentifier
让团队:APIFilterIdentifier = EnumTestWithCustomInit.teamFilterIdentifier
switch filterIdentifier {
case everyone:
self = .Everyone
案例小组:
self = .Team
默认值:
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 {
returneveryone
}
private static var teamFilterIdentifier:APIFilterIdentifier {
returnmyteam
}
}
我知道这有点老了,但这是否符合您的要求?
typealias FilterIdentifier = String
枚举DefaultAPIFilters:FilterIdentifier {
case Everyone =everyone
case Team =team
}
枚举APIFilters {
case默认(DefaultAPIFilters)
case自定义(FilterIdentifier)
}
让everyoneFilter = APIFilters.Default(.Everyone)
让teamFilter = APIFilters.Default(.Team)
让clownFilter = APIFilters.Custom(clowns_only)
Swift question is there a way of having an enum type with one case that can have an associated value.
I have an API that gives me available filters, it's unlikely but possible that the API will add additional filter types. So if the API sends an unknown filter type I want to keep that information associated with the enum.
Below are the different ideas I had about doing this.
My first two tries didn't compile. My third try just feels a bit clunky.
Does anyone have a better way of doing this? Do you think I just shouldn't use an enum for this problem?
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"
}
}
I know this is a bit old, but would this work for what you want?
typealias FilterIdentifier = String
enum DefaultAPIFilters: FilterIdentifier {
case Everyone = "everyone"
case Team = "team"
}
enum APIFilters {
case Default(DefaultAPIFilters)
case Custom(FilterIdentifier)
}
let everyoneFilter = APIFilters.Default(.Everyone)
let teamFilter = APIFilters.Default(.Team)
let clownFilter = APIFilters.Custom("clowns_only")
这篇关于如何使用Swift枚举实现默认关联值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!