你如何对 optional 的 optional 执行可选绑定?

Posted

技术标签:

【中文标题】你如何对 optional 的 optional 执行可选绑定?【英文标题】:How do you perform optional binding on an optional of optional? 【发布时间】:2015-08-06 11:59:19 【问题描述】:

如何对 optional 的 optional 进行可选绑定?

例如,假设 UIViewController 的 navigationController 属性是可选的。我应该使用方法#1还是方法#2,还是有第三种方法?

方法#1

if let navigationController = viewController.navigationController! 


方法#2

if let optionalNavigationController = viewController.navigationController 
   let navigationController = optionalNavigationController 

    

【问题讨论】:

相关:How to unwrap Optional<Optional<T>> in Swift 1.2. 【参考方案1】:

还有一个解决办法:

if let stillOptional = viewController.navigationController, let notOptional = stillOptional 
    //use notOptional here

【讨论】:

我列出的方法 #1 似乎更干净,因为它只有一个级别? @Boon 它更干净,但如果navigationControllernil,它会因为强制展开而崩溃。【参考方案2】:
if let navigationController = viewController?.navigationController

【讨论】:

为什么在 viewController 上是可选的? Optional chaining ViewController 在这种情况下不是可选的,为什么要链接它? 哦,对不起。我很困惑。【参考方案3】:

更多的函数式编程解决方案:

if let a = optionalOfOptional?.map($0) 
    println(a)

【讨论】:

【参考方案4】:

如果您知道视图控制器有一个导航控制器,因为您在 Interface Builder 中设计了它或以编程方式创建了它,请声明一个变量

var navigationController : UINavigationController!

并将viewDidLoad() 中的导航控制器分配为隐式展开可选

navigationController = viewController!.navigationController!

如果您不知道,请使用其他答案中描述的普通可选绑定

【讨论】:

以上是关于你如何对 optional 的 optional 执行可选绑定?的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 Rails 中路由 [OPTIONS]?

如何对空的Optional执行空检查

如何选中select中的所有option

如何优化get_option()的sql查询次数?

我如何在熊猫中对这个操作进行矢量化?

JDK8,Optional