我正在重写一些代码,并尝试使函数更少嵌套。该函数将枚举作为参数,并在其上执行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根据枚举值选择正确的函数。
答案 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
调用它来重新排列代码,这样可以避免过度缩进,但是您无法避免运行时条件。那只是斯威夫特。