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