ios Xcode 8/स्विफ्ट 3: “UIViewController के प्रकार की अभिव्यक्ति? अप्रयुक्त है ”चेतावनी




swift (6)

जब जीवन आपको नींबू देता है, तो एक विस्तार करें:

import UIKit

extension UINavigationController {
    func pop(animated: Bool) {
        _ = self.popViewController(animated: animated)
    }

    func popToRoot(animated: Bool) {
        _ = self.popToRootViewController(animated: animated)
    }
}

ध्यान दें कि @discardableResult func pop(animated: Bool) -> UIViewController? जैसा कुछ जोड़ना @discardableResult func pop(animated: Bool) -> UIViewController? उसी चेतावनी में परिणाम होगा जिससे आप बचने की कोशिश कर रहे हैं।

एक्सटेंशन के साथ अब आप लिख सकते हैं:

func exitViewController()
{
    navigationController?.pop(animated: true)
}

func popToTheRootOfNav() {
    navigationController?.popToRoot(animated: true)
}

संपादित करें: जोड़ा गया popToRoot भी।

मुझे निम्नलिखित फ़ंक्शन मिला है जो पहले साफ-सुथरा संकलित करता है लेकिन Xcode 8 के साथ चेतावनी देता है।

func exitViewController()
{
    navigationController?.popViewController(animated: true)
}

"प्रकार की अभिव्यक्ति" UIViewController? "अप्रयुक्त है"।

यह ऐसा क्यों कह रहा है और क्या इसे हटाने का कोई तरीका है?

कोड अपेक्षित रूप से निष्पादित होता है।


यदि आप एक्सटेंशन की सड़क पर जाना चाहते हैं जैसे कि कोडरॉइस का जवाब तो आपको @descardableResult का उपयोग करना चाहिए। यह सभी संभावनाएं रखता है, लेकिन चेतावनी को चुप करता है।

import UIKit

extension UINavigationController {
    @discardableResult func pop(animated: Bool) -> UIViewController? {
        return self.popViewController(animated: animated)
    }

    @discardableResult func popToRoot(animated: Bool) -> [UIViewController]? {
        return self.popToRootViewController(animated: animated)
    }
}

स्विफ्ट 3 में, किसी फ़ंक्शन के रिटर्न वैल्यू को अनदेखा करना, जिसमें चेतावनी में घोषित रिटर्न वैल्यू परिणाम हैं।

इससे बाहर निकलने का एक तरीका @discardableResult विशेषता के साथ फ़ंक्शन को चिह्नित करना है। चूंकि आपके पास इस फ़ंक्शन पर नियंत्रण नहीं है, इसलिए यह काम नहीं करेगा।

चेतावनी से छुटकारा पाने के लिए अन्य विधि _ लिए मान निर्दिष्ट करना है। यह संकलक को बताता है कि आप जानते हैं कि विधि एक मान लौटाती है लेकिन आप इसे स्मृति में नहीं रखना चाहते हैं।

let _ = navigationController?.popViewController(animated: true)

एक और तरीका है कि आप self.navigationController? को self.navigationController? कर सकते हैं self.navigationController? मान और popViewController फ़ंक्शन को कॉल करें।

    if let navigationController = navigationController {
        navigationController.popViewController(animated: true)
    }

टी एल; डॉ

popViewController(animated:) UIViewController? लौटाता है UIViewController? , और संकलक वह चेतावनी दे रहा है क्योंकि आप मूल्य पर कब्जा नहीं कर रहे हैं। इसका समाधान इसे अंडरस्कोर में असाइन करना है:

_ = navigationController?.popViewController(animated: true)

स्विफ्ट 3 बदलें

स्विफ्ट 3 से पहले, सभी तरीकों में डिफ़ॉल्ट रूप से "त्यागने योग्य परिणाम" था। जब आपने विधि वापस नहीं ली तो कोई चेतावनी नहीं होगी।

संकलक को यह बताने के लिए कि परिणाम पर कब्जा किया जाना चाहिए, आपको विधि की घोषणा से पहले @warn_unused_result जोड़ना @warn_unused_result । इसका उपयोग उन तरीकों के लिए किया जाएगा जिनके पास एक उत्परिवर्तनीय रूप है (उदा। sort और sort sortInPlace )। आप इसके संकलक को बताने के लिए @warn_unused_result(mutable_variant="mutableMethodHere")

हालाँकि, स्विफ्ट 3 के साथ, व्यवहार फ़्लिप है। सभी तरीकों ने अब चेतावनी दी है कि वापसी मूल्य पर कब्जा नहीं किया गया है। यदि आप संकलक को बताना चाहते हैं कि चेतावनी आवश्यक नहीं है, तो आप विधि की घोषणा से पहले @discardableResult जोड़ें।

यदि आप रिटर्न वैल्यू का उपयोग नहीं करना चाहते हैं, तो आपको इसे अंडरस्कोर पर असाइन करके कंपाइलर को स्पष्ट रूप से बताना होगा:

_ = someMethodThatReturnsSomething()

इसे स्विफ्ट 3 में जोड़ने के लिए प्रेरणा:

  • संभावित बगों की रोकथाम (पूर्व sort का उपयोग करके यह संग्रह को संशोधित करता है)
  • अन्य सहयोगियों के लिए परिणाम पर कब्जा करने या न करने की स्पष्ट मंशा

UIKit API इस पर पीछे दिखाई देता है, पूरी तरह से सामान्य (यदि अधिक सामान्य नहीं है) popViewController(animated:) का उपयोग रिटर्न मान को कैप्चर किए बिना करने के लिए @discardableResult नहीं जोड़ रहा है।

अधिक पढ़ें


इस हालत में त्यागने योग्यResult का प्रयोग करें।

<स्विफ्ट प्रोग्रामिंग भाषा> के अनुसार, अध्याय भाषा संदर्भ - गुण।

discardableResult

फ़ंक्शन या पद्धति को दबाने वाले संकलक को दबाने के लिए इस विशेषता को एक फ़ंक्शन या विधि घोषणा पर लागू करें जब कोई मान लौटाता है, जिसे उसके परिणाम का उपयोग किए बिना कहा जाता है।

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID347

<Swift प्रोग्रामिंग लैंग्वेज>, चैप्टर लैंग्वेज गाइड - मेथड्स में भी एक डेमो है।

@discardableResult
    mutating func advance(to level: Int) -> Bool {
    ...
return true
}

क्योंकि यह जरूरी नहीं है कि कोड के लिए एक गलती हो जो अग्रिम (:) तरीके से रिटर्न वैल्यू को नजरअंदाज करे, यह फ़ंक्शन @discardableResult विशेषता के साथ चिह्नित है। इस विशेषता के बारे में अधिक जानकारी के लिए, विशेषताएँ देखें।

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID234





swift