ios – if-let语句不解包可选

ios – if-let语句不解包可选,第1张

概述我在我的代码中遇到了一些好奇的东西,并且想知道这个行为是否有直接的解释.鉴于以下声明: if let tabBarController = topViewController as? UITabBarController { for subcontroller in tabBarController.viewControllers! { println(su 我在我的代码中遇到了一些好奇的东西,并且想知道这个行为是否有直接的解释.鉴于以下声明:
if let tabbarController = topVIEwController as? UITabbarController {        for subcontroller in tabbarController.vIEwControllers! {            println(subcontroller.vIEw)            if let subcontrollerVIEw = subcontroller.vIEw {                println(subcontrollerVIEw)                println(subcontrollerVIEw!)                if subcontrollerVIEw!.window != nil && subcontroller.isVIEwLoaded() {                    topVIEwController = subcontroller as? UIVIEwController                    break;                }            }        }    }

据我所知,if-let语句应该为我解开条件 – 但这不是这里展示的行为.除非我再次打开可选项,否则我无法访问subcontrollerVIEw的window属性. x-code控制台返回以下内容:

Optional(<UILayoutContainerVIEw: 0x7fbccd44e7f0; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x7fbccacdde90>; layer = <CALayer: 0x7fbccd440e30>>)Optional(<UILayoutContainerVIEw: 0x7fbccd44e7f0; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x7fbccacdde90>; layer = <CALayer: 0x7fbccd440e30>>)<UILayoutContainerVIEw: 0x7fbccd44e7f0; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x7fbccacdde90>; layer = <CALayer: 0x7fbccd440e30>>

展开的可选和if-let常量是相同的.为什么?

解决方法 你的问题是AnyObject. (如果有疑问,你的问题总是AnyObject;它是一种应该尽可能避免的邪恶类型.唯一更糟的是AnyObject?)

问题是tabbarController.vIEwControllers返回[AnyObject] ?,可选的促销可能会导致事情横向发展.它可能会推广AnyObject?一个AnyObject ??然后变得困惑.这有点像编译器错误,但也只是AnyObject带来的疯狂.所以答案就是尽可能快地摆脱它.

而不是这个:

for subcontroller in tabbarController.vIEwControllers! {

你要这个:

if let vIEwControllers = tabbarController.vIEwControllers as? [UIVIEwController] {   for subcontroller in vIEwControllers {

所以完整的代码是这样的:

if let tabbarController = topVIEwController as? UITabbarController {    if let vIEwControllers = tabbarController.vIEwControllers as? [UIVIEwController] {        for subcontroller in vIEwControllers {            if let subcontrollerVIEw = subcontroller.vIEw {                if subcontrollerVIEw.window != nil && subcontroller.isVIEwLoaded() {                    topVIEwController = subcontroller                    break;                } } } } }

但我们可以做得更好.首先,可选链接通常是管理多个if-lets的更好方法,当它不能正常工作时,我们可以使用Swift 1.2的新的multi-if-let语法来实现:

if let tabbarController = topVIEwController as? UITabbarController,vIEwControllers = tabbarController.vIEwControllers as? [UIVIEwController] {        for subcontroller in vIEwControllers {            if subcontroller.vIEw?.window != nil && subcontroller.isVIEwLoaded() {                topVIEwController = subcontroller                break;            } } }
总结

以上是内存溢出为你收集整理的ios – if-let语句不解包可选全部内容,希望文章能够帮你解决ios – if-let语句不解包可选所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1107607.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存