根据参数

时间:2016-05-23 20:25:56

标签: swift function

我正在重写一些代码,并尝试使函数更少嵌套。该函数将枚举作为参数,并在其上执行switch。这没关系,但它增加了两个级别的缩进。

我想做的是这样的事情:

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

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

枚举定义如下:

enum TripStatus:String {
    case Confirmed = "Confirmed", Unconfirmed = "Unconfirmed", Tracking = "Tracking", Empty = "Empty"
}

目标是我可以调用getTrips(status)并且Swift根据枚举值选择正确的函数。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

TripStatus.Confirmed是一个值,而不是一个类型。这就是为什么在Swift 3中,正确的样式将是TripStatus.confirmed。 Swift只能专门处理类型上的函数,而不是值。因此,除了可以定义函数func sqrt(1) { return 1 }之外,不能完成您所描述的内容(这种函数定义在多种语言中很常见;只是不是Swift)。

所以最终你的switch语句(或等效的if)必须存在。您可以通过将确认逻辑放入其自己的函数并从switch调用它来重新排列代码,这样可以避免过度缩进,但是您无法避免运行时条件。那只是斯威夫特。