检查 segue 标识符而不是使用失败的类型转换有好处吗?
Are there benefits to checking for segue identifiers rather than using failed type casting?
当我们在具有多个 segue 的 UIViewController
子类中实现 prepareForSegue:sender:
方法时,Objective-C 中的一个习惯用法是为情节提要中的 segue 分配一个标识符,然后包装prepareForSegue:sender:
中的逻辑在检查 segue identifier
的 if
语句中。例如:
if segue.identifier == "destinationA"
// prepare destinationA stuff
else if segue.identifier == "destinationB"
// prepare destinationB stuff
...
在 Swift 中,我们实际上是被 API 强制在获取目标视图控制器的实例时使用类型转换。由于这可以优雅地失败,我的问题是我们应该继续并依赖带有条件类型转换的可选绑定(as?
)还是我们仍然应该依赖if
陈述?
例如,在可能的情况下,我们是否应该支持仅依赖类型转换的简洁性:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let destination = segue.destinationViewController as? DestinationAController {
// prepare stuff for Destination A
} else if let destination = segue.destinationViewController as? DestinationBController {
// prepare stuff for Destination B
}
}
或者像我们在 Objective-C:
中所做的那样,仍然将所有内容包装在 if
语句中是否有好处
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "destinationA" {
if let destination = segue.destinationViewController as? DestinationAController {
// prepare stuff for Destination A
}
} else if segue.identifier == "destinationB" {
if let destination = segue.destinationViewController as? DestinationBController {
// prepare stuff for Destination B
}
}
}
注意:我知道可以使用开关,但这不是重点。
依赖标识符的好处是,如果您的 source/destination 视图控制器更改为另一个 class,您可以更轻松地捕获它,因为它会落入正确的标识符桶中,但会失败沮丧。严格来说,代码路径是不一样的。使用更简洁的样式,直到执行完所有向下转换后才会捕获失败的案例。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "destinationA" {
if let destination = segue.destinationViewController as? DestinationAController {
// prepare stuff for Destination A
}
else {
print("Something is wrong with the controller for destination A!")
}
} else if segue.identifier == "destinationB" {
if let destination = segue.destinationViewController as? DestinationBController {
// prepare stuff for Destination B
}
}
}
对比
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let destination = segue.destinationViewController as? DestinationAController {
// prepare stuff for Destination A
} else if let destination = segue.destinationViewController as? DestinationBController {
// prepare stuff for Destination B
}
else {
print("Something is wrong with the controller!")
}
}
另一个好处是您可以在标识符测试之后和执行向下转换之前执行一些其他逻辑。
就意图而言,使用标识符阅读代码也更快 - 不仅更短,而且作为 Swift 字符串的标识符可以变得非常具有描述性。
当我们在具有多个 segue 的 UIViewController
子类中实现 prepareForSegue:sender:
方法时,Objective-C 中的一个习惯用法是为情节提要中的 segue 分配一个标识符,然后包装prepareForSegue:sender:
中的逻辑在检查 segue identifier
的 if
语句中。例如:
if segue.identifier == "destinationA"
// prepare destinationA stuff
else if segue.identifier == "destinationB"
// prepare destinationB stuff
...
在 Swift 中,我们实际上是被 API 强制在获取目标视图控制器的实例时使用类型转换。由于这可以优雅地失败,我的问题是我们应该继续并依赖带有条件类型转换的可选绑定(as?
)还是我们仍然应该依赖if
陈述?
例如,在可能的情况下,我们是否应该支持仅依赖类型转换的简洁性:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let destination = segue.destinationViewController as? DestinationAController {
// prepare stuff for Destination A
} else if let destination = segue.destinationViewController as? DestinationBController {
// prepare stuff for Destination B
}
}
或者像我们在 Objective-C:
中所做的那样,仍然将所有内容包装在if
语句中是否有好处
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "destinationA" {
if let destination = segue.destinationViewController as? DestinationAController {
// prepare stuff for Destination A
}
} else if segue.identifier == "destinationB" {
if let destination = segue.destinationViewController as? DestinationBController {
// prepare stuff for Destination B
}
}
}
注意:我知道可以使用开关,但这不是重点。
依赖标识符的好处是,如果您的 source/destination 视图控制器更改为另一个 class,您可以更轻松地捕获它,因为它会落入正确的标识符桶中,但会失败沮丧。严格来说,代码路径是不一样的。使用更简洁的样式,直到执行完所有向下转换后才会捕获失败的案例。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "destinationA" {
if let destination = segue.destinationViewController as? DestinationAController {
// prepare stuff for Destination A
}
else {
print("Something is wrong with the controller for destination A!")
}
} else if segue.identifier == "destinationB" {
if let destination = segue.destinationViewController as? DestinationBController {
// prepare stuff for Destination B
}
}
}
对比
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let destination = segue.destinationViewController as? DestinationAController {
// prepare stuff for Destination A
} else if let destination = segue.destinationViewController as? DestinationBController {
// prepare stuff for Destination B
}
else {
print("Something is wrong with the controller!")
}
}
另一个好处是您可以在标识符测试之后和执行向下转换之前执行一些其他逻辑。
就意图而言,使用标识符阅读代码也更快 - 不仅更短,而且作为 Swift 字符串的标识符可以变得非常具有描述性。