सशर्त बंधन: यदि त्रुटि हो - सशर्त बाध्यकारी के लिए प्रारंभिक में वैकल्पिक प्रकार होना चाहिए


120

मैं अपने डेटा स्रोत और कोड की निम्न पंक्ति से एक पंक्ति को हटाने का प्रयास कर रहा हूं:

if let tv = tableView {

निम्नलिखित त्रुटि का कारण बनता है:

सशर्त बाध्यकारी के लिए प्रारंभिक में वैकल्पिक प्रकार होना चाहिए, न कि UITableView

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

// Override to support editing the table view.
func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {

        // Delete the row from the data source

    if let tv = tableView {

            myData.removeAtIndex(indexPath.row)

            tv.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

मुझे निम्नलिखित को कैसे सही करना चाहिए?

 if let tv = tableView {

8
चूंकि tableViewवैकल्पिक मूल्य नहीं है, इसलिए यह जांचने की कोई आवश्यकता नहीं है कि यह शून्य है या नहीं। तो आप सीधे इसका उपयोग कर सकते हैं, मेरा मतलब है कि इसे हटा दें if let और tableViewफ़ंक्शन में उपयोग करें
एरिक कियान

पोस्टरिटी के लिए, इस मुद्दे को तय करने के बाद, मैं भाग गया variable with getter/setter cannot have an initial value, जिसे इनिशियलाइज़ेशन के बाद बचे हुए {} ब्लॉक को हटाकर हल किया गया था, इस जवाब को ala: stackoverflow.com/a/36002958/4544328
Jake T.

जवाबों:


216

if let/ if varवैकल्पिक बाइंडिंग केवल तभी काम करती है जब अभिव्यक्ति के दाईं ओर का परिणाम एक वैकल्पिक हो। यदि दाईं ओर का परिणाम वैकल्पिक नहीं है, तो आप इस वैकल्पिक बंधन का उपयोग नहीं कर सकते। इस वैकल्पिक बाइंडिंग के बिंदु को जाँचना है nilऔर केवल चर का उपयोग करना है यदि यह गैर है- nil

आपके मामले में, tableViewपैरामीटर को गैर-वैकल्पिक प्रकार के रूप में घोषित किया गया है UITableView। यह कभी नहीं होने की गारंटी है nil। इसलिए यहां वैकल्पिक बाध्यकारी अनावश्यक है।

func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        myData.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

हमें बस इतना करना है कि इससे छुटकारा पाएं if letऔर tvइसके भीतर होने वाली किसी भी घटना को बदल दें tableView


17

मेरी विशिष्ट समस्या के लिए मुझे प्रतिस्थापित करना पड़ा

if let count = 1
    {
        // do something ...
    }

साथ में

let count = 1
if(count > 0)
    {
        // do something ...
    }

2
इस आदमी द्वारा सर्वश्रेष्ठ उत्तर देखें टिप्पणियाँ stackoverflow.com/a/31039427/2797944
शौकत शेख

16

ऐसे मामले में जहां आप एक कस्टम सेल प्रकार का उपयोग कर रहे हैं, ArticleCell कहते हैं, आपको एक त्रुटि मिल सकती है जो कहती है:

    Initializer for conditional binding must have Optional type, not 'ArticleCell'

यदि आपकी लाइन ऑफ कोड कुछ इस तरह दिखती है तो आपको यह त्रुटि मिलेगी:

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as! ArticleCell 

आप निम्न कार्य करके इस त्रुटि को ठीक कर सकते हैं:

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as ArticleCell?

यदि आप ऊपर की जाँच करते हैं, तो आप देखेंगे कि उत्तरार्द्ध ArticleCell के सेल के लिए वैकल्पिक कास्टिंग का उपयोग कर रहा है।


मेरे मामले में मुझे उपयोग करने की आवश्यकता थीas! ArticleCell?
lilbiscuit

9

गार्ड के बयानों के लिए भी यही लागू होता है । वही त्रुटि संदेश मुझे इस पोस्ट और उत्तर (धन्यवाद @ होग्रीफ) की ओर ले जाता है।

कोड: व्यक्ति का अंतिम नाम केवल तभी प्रिंट करें जब मध्य नाम चार वर्णों से कम हो।

func greetByMiddleName(name: (first: String, middle: String?, last: String?)) {
    guard let Name = name.last where name.middle?.characters.count < 4 else {
        print("Hi there)")
        return
    }
    print("Hey \(Name)!")
}

जब तक मैंने एक वैकल्पिक पैरामीटर के रूप में अंतिम घोषित नहीं किया, तब तक मैं वही त्रुटि देख रहा था।


4

कंडीशन बाइंडिंग में ऑप्टिनल टाइप होना चाहिए जिसका अर्थ है कि आप केवल स्टेटमेंट में वैकल्पिक मानों को बांध सकते हैं

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        // Delete the row from the data source

        if let tv = tableView as UITableView? {


        }
    }
}

यह ठीक काम करेगा लेकिन सुनिश्चित करें कि जब आप इसका उपयोग करते हैं तो इसे वैकल्पिक प्रकार का होना चाहिए "?"


0

ठीक है, यह अभी भी सुविधाजनक होगा (वाक्यविन्यास) यदि हम सामान्य मानों को घोषित कर सकते हैं यदि स्थिति के अंदर। तो, यहाँ एक तरकीब है: आप कंपाइलर Optional.some(T)को यह मान सकते हैं कि मूल्य का एक असाइनमेंट है जैसे:

    if let i = "abc".firstIndex(of: "a"),
        let i_int = .some(i.utf16Offset(in: "abc")),
        i_int < 1 {
        // Code
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.