Swift 根据参数调用不同的函数

Swift 根据参数调用不同的函数,swift,function,Swift,Function,我正在重写一些代码,并试图减少函数的嵌套。该函数将枚举作为参数,并对其执行开关。这是可以的,但它增加了两级缩进 我想做的是这样的: func getTrips<T : TripStatus.Confirmed> (status:T) { //Do one thing } func getTrips<T : TripStatus.Unconfirmed> (status:T) { //Do another thing } 目标是我可以调用getTrips

我正在重写一些代码,并试图减少函数的嵌套。该函数将枚举作为参数,并对其执行
开关。这是可以的,但它增加了两级缩进

我想做的是这样的:

func getTrips<T : TripStatus.Confirmed> (status:T) {
    //Do one thing
}

func getTrips<T : TripStatus.Unconfirmed> (status:T) {
    //Do another thing
}

目标是我可以调用
getTrips(status)
,然后Swift根据enum值选择正确的函数

您可以将计算属性添加到
TripStatus
中,根据状态返回要执行的函数,然后调用该属性。例如(在示例中,我返回一个可选函数):


您可以将计算属性添加到
TripStatus
中,根据状态返回要执行的函数,然后调用该函数。例如(在示例中,我返回一个可选函数):


TripStatus.Confirmed
是一个值,而不是类型。这就是为什么在Swift 3中正确的样式将是
TripStatus.confirmed
。Swift只能对类型而不是值专门化函数。因此,不能像定义函数一样定义函数
func sqrt(1){return 1}
(这种函数定义在几种语言中都很常见,但不是Swift)


因此,最终您的
开关
语句(或等效的
,如果
)必须存在。您可以通过将已确认的逻辑放入自己的函数中并从
开关调用该函数来重新排列代码,这样可以避免过度缩进,但无法避免运行时条件。这只是Swift。

TripStatus.Confirmed
是一个值,而不是一种类型。这就是为什么在Swift 3中正确的样式将是
TripStatus.confirmed
。Swift只能对类型而不是值专门化函数。因此,不能像定义函数一样定义函数
func sqrt(1){return 1}
(这种函数定义在几种语言中都很常见,但不是Swift)


因此,最终您的
开关
语句(或等效的
,如果
)必须存在。您可以通过将已确认的逻辑放入自己的函数中并从
开关调用该函数来重新排列代码,这样可以避免过度缩进,但无法避免运行时条件。那太快了。

好的。谢谢你的澄清。不过,我会接受另一个答案,因为我执行了该实现。谢谢你的澄清。尽管如此,我还是会接受另一个答案,因为我执行了该实现。
enum TripStatus:String {
    case Confirmed = "Confirmed", Unconfirmed = "Unconfirmed", Tracking = "Tracking", Empty = "Empty"
}
enum TripStatus: String {
    case Confirmed = "Confirmed", Unconfirmed = "Unconfirmed", Tracking = "Tracking", Empty = "Empty"

    var getTrips : (() -> ())? {
        switch self {
            case .Confirmed:    return self.getConfirmedTrips
            case .Unconfirmed:  return self.getUnconfirmedTrips
            default:            return nil
        }
    }

    func getConfirmedTrips() { print("getConfirmedTrips") }
    func getUnconfirmedTrips() { print("getConfirmedTrips") }
}

let status = TripStatus.Confirmed

status.getTrips?() // prints getConfirmedTrips