2015-02-15 6 views
6

को अनदेखा नहीं करता है, मैंने अपने कोड में कुछ ऐसा किया है जो उत्सुक लगता है और सोच रहा था कि इस व्यवहार के लिए सीधा स्पष्टीकरण है या नहीं। निम्नलिखित बयान को देखते हुए:if-let कथन वैकल्पिक

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; 
       } 
      } 
     } 
    } 

अब के रूप में तक मुझे पता है अगर-जाने बयान मेरे लिए सशर्त खोलने चाहिए - लेकिन इस व्यवहार यहाँ प्रदर्शित नहीं है। मैं windowsubcontrollerView की संपत्ति तक नहीं पहुंच सकता जब तक कि मैं फिर से वैकल्पिक नहीं खोलता। एक्स-कोड कंसोल निम्न देता है:

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 स्थिर समान हैं। क्यूं कर?

+0

कुछ भी नहीं है यदि आपका वैकल्पिक शून्य है तो अनचाहे हो जाएगा। – gnasher729

+0

दाएं, लेकिन कंसोल आउटपुट को देखें - यह शून्य नहीं है – kellanburket

+1

मेरे लिए एक बग की तरह दिखता है, क्या आप इसे एक छोटी परियोजना में अलग कर सकते हैं? यदि ऐसा है, तो आप इसे यहां पोस्ट कर सकते हैं और हम इसे स्वयं देख सकते हैं। यदि अभी भी एक मुद्दा है कि ऐप्पल को रडार जमा करने के लिए परियोजना बहुत अच्छी होगी। – drewag

उत्तर

6

आपकी समस्या AnyObject है। (संदेह होने पर, आपकी समस्या को हमेशा AnyObject है, यह एक दुष्ट प्रकार है कि जहां तक ​​संभव हो परहेज किया जाना चाहिए है केवल एक चीज बदतर AnyObject? है।।)

दिक्कत यह है कि tabBarController.viewControllers रिटर्न [AnyObject]?, और वैकल्पिक पदोन्नति शायद का कारण बनता है चीजें किनारे जाने के लिए। यह AnyObject? को AnyObject?? पर प्रचारित करने और फिर भ्रमित होने की संभावना है। यह कुछ हद तक एक कंपाइलर बग है, लेकिन केवल पागलपन जो AnyObject के साथ आता है। तो जवाब जितना जल्दी हो सके इसे से छुटकारा पाने के लिए है।

इसके बजाय इस बात का

:

if let viewControllers = tabBarController.viewControllers as? [UIViewController] { 
    for subcontroller in viewControllers { 

तो पूर्ण कोड यह है::

for subcontroller in tabBarController.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; 
       } } } } } 

लेकिन हम बेहतर कर सकते हैं। सबसे पहले, वैकल्पिक श्रृंखलन अक्सर अगर-सुविधा देता है कई प्रबंधन करने के लिए एक बेहतर तरीका है, और जब यह अच्छी तरह से काम नहीं करता है, हम स्विफ्ट 1.2 की नई बहु अगर-जाने सिंटैक्स का उपयोग करें इसे पाने के लिए कर सकते हैं:

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; 
      } } } 
+1

क्या एक उत्कृष्ट जवाब है। @Rob - ऐप्पल ABBarController.viewControllers के रिटर्न प्रकार के लिए AnyObject का उपयोग क्यों करता है। क्यों न केवल एक [UIViewController] सरणी लौटाएं - मुझे लगता है क्योंकि व्यू कंट्रोलर सभी UIViewController के उप-वर्ग होंगे? ... फिर भी यह एक बदसूरत समाधान – Woodstock

+1

लगता है क्योंकि ऐसा इसलिए है कि हम अभी भी स्विफ्ट इंटरफेस में संक्रमण कर रहे हैं। ओबीजेसी इंटरफेस एक 'एनएसएआरएआरई' देता है, जो कोई प्रकार की जानकारी प्रदान नहीं करता है। स्विफ्ट में ऐप्पल स्पष्ट रूप से '[AnyObject]' में अनुवाद का उपयोग कर स्वचालित रूपांतरण स्क्रिप्ट है। इसे कुछ और बनाने के लिए, ऐप्पल डेवलपर्स को एपीआई को हाथ-संशोधित करना होगा। वे प्रत्येक रिलीज में चरण-दर-चरण कर रहे हैं, लेकिन ऐसे कई टुकड़े हैं जिन्हें अभी तक तय नहीं किया गया है। –

+0

वास्तव में ... अनुमान है कि वास्तव में कोई समाधान नहीं है क्योंकि ViewController subclass प्रकार सभी टैबबार नियंत्रक में भिन्न होने की संभावना है। – Woodstock

संबंधित मुद्दे