【问题标题】:How should I implement Default Associated Values with Swift Enums?我应该如何使用 Swift 枚举实现默认关联值?
【发布时间】: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 中是不可能的。

标签: swift enums


【解决方案1】:

我知道这有点老了,但这能满足你的需求吗?

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")

【讨论】:

  • 如何从这个结构中获取潜在价值?例如,获取任意操作的字符串
  • 我喜欢这种方法。我想我可能会将 DefaultAPIFilters 设为内部枚举。
  • 什么是默认关联值?
【解决方案2】:

扩展内森·佩里的回应:

你可以添加一个

var underlyingString: String {
  return getUnderlyingString(self) 
}

到枚举。然后定义

func getUnderlyingString(apiFilter: APIFilters) -> String { 
    switch apiFilter {
    case .Default(let defaultAPIFilter):
        return defaultAPIFilter.rawValue
    case .Custom(let custom):
        return custom
    }
}

【讨论】:

    【解决方案3】:

    根据这个答案:Default value for Enum in Swift

    我推荐使用这种方法

    public enum Result {
        case passed(hint: String)
        case failed(message: String)
    
        static let passed: Self = .passed(hint: "")
    }
    
    
    let res: Result = Result.passed
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 2016-05-08
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多