कक्षा में कोई प्रारंभिक स्विफ्ट नहीं है


181

मुझे स्विफ्ट क्लास की समस्या है। मेरे पास UITableViewController क्लास और UITableViewCell क्लास के लिए एक स्विफ्ट फाइल है। मेरी समस्या UITableViewCell क्लास, और आउटलेट्स है। इस वर्ग में एक त्रुटि है क्लास "होमसेल" में कोई प्रारंभिक अक्षर नहीं है , और मैं इस समस्या को नहीं समझता।

आपकी प्रतिक्रियाओं के लिए धन्यवाद।

import Foundation
import UIKit

class HomeTable: UITableViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet var tableViex: UITableView!

    var items: [(String, String, String)] = [
        ("Test", "123", "1.jpeg"),
        ("Test2", "236", "2.jpeg"),
        ("Test3", "678", "3.jpeg")
    ]

    override func viewDidLoad() {
        super.viewDidLoad()

        var nib = UINib(nibName: "HomeCell", bundle: nil)
        tableView.registerNib(nib, forCellReuseIdentifier: "bookCell")
    }

    // Number row
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }

    // Style Cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("bookCell") as UITableViewCell

        // Style here

        return cell

    }

    // Select row
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // Select
    }

}

// PROBLEM HERE
class HomeCell : UITableViewCell {

    @IBOutlet var imgBook: UIImageView
    @IBOutlet var titleBook: UILabel
    @IBOutlet var pageBook: UILabel

    func loadItem(#title: String, page: String, image:String) {
        titleBook.text = title
        pageBook.text = page
        imgBook.image = UIImage(named: image)
    }

}

क्या आपको वैकल्पिक यूआईएनबी के रूप में स्पष्ट रूप से निब चर के प्रकार की आवश्यकता है?
कोकोडेलिका

जवाबों:


257

आपको प्रारंभिक रूप से अपरिवर्तित वैकल्पिक का उपयोग करना होगा ताकि स्विफ्ट प्रारंभिक चरण के दौरान परिपत्र निर्भरता (माता-पिता <-> इस मामले में यूआई घटकों के बच्चे) के साथ सामना कर सके।

@IBOutlet var imgBook: UIImageView!
@IBOutlet var titleBook: UILabel!
@IBOutlet var pageBook: UILabel!

इस डॉक्टर को पढ़ें , वे इसे अच्छी तरह से समझाते हैं।


21
आपकी व्याख्या, और यह कि डॉक्टर, सभी मेरे लिए समझ में आते हैं, लेकिन त्रुटि संदेश नहीं!
कोको

4
यह शायद Apple के लिए एक सवाल है
mprivat

साथ ही @IBOutlets को बरकरार चक्र से बचने के लिए कमजोर के रूप में चिह्नित किया जाना चाहिए।
डेनिस पशकोव

@ डेनिस पश्कोव जहां तक ​​मुझे पता है, यह केवल IBOutlets के लिए है जो कि व्यूअंट्रोलर के दृश्य पदानुक्रम में है। अन्यथा यह तुरंत जारी हो जाएगा क्योंकि कोई भी इसे धारण नहीं करेगा।
एलस्टन

3
मुझे यह समस्या थी जहाँ मैंने एक बूल का उपयोग करके परिभाषित किया था var myBool: Bool
जंगलबेदेव

96

त्वरित सुधार - सुनिश्चित करें कि सभी वेरिएबल्स जो प्रारंभ होने पर प्राप्त नहीं होते हैं (जैसे var num : Int?बनाम var num = 5) या तो ?या !

लांग जवाब (सिफारिश) - पढ़ने के दस्तावेज़ के रूप में प्रति mprivat पता चलता है ...


इस त्रुटि को हल करने के लिए आपको डिफ़ॉल्ट मान सेट करने की आवश्यकता है? चर, उदाहरण के लिए: showUserPointViewDelegate दें: ShowUserPointsViewControllerControl? = नील
व्लादिमीर वोडोलाज़की

+1 का ?मतलब यह शून्य हो सकता है, लेकिन अगर यह था तो आगे बढ़ने और कुछ भी नहीं करने के साथ कोई समस्या नहीं है। !इसका मतलब यह है कि अगर यह शून्य था, तो दुर्घटना-इन दोनों ने दीक्षा की आवश्यकता को पूरा किया - जिससे आप संकलक को सूचित कर रहे हैं: मुझे पता है / यह चाहते हैं कि यह शून्य हो जाएगा।
हनी

खोज करें varऔर letआप नियंत्रक देखें, और लापता !s और ?s
Wiingaard

33

यह Apple डॉक से है

उस वर्ग या संरचना का निर्माण होने तक वर्गों और संरचनाओं को अपने सभी संग्रहीत गुणों को एक उचित प्रारंभिक मूल्य पर सेट करना होगा। एक अनिश्चित स्थिति में संग्रहीत संपत्तियों को नहीं छोड़ा जा सकता है।

आपको त्रुटि संदेश मिल जाता है क्लास "होमसेल" का कोई आरंभीकरण नहीं है क्योंकि आपके चर एक अनिश्चित स्थिति में हैं। या तो आप इनिशलाइज़र बनाते हैं या आप उनका उपयोग करके वैकल्पिक प्रकार बनाते हैं! या?


32

मेरा उत्तर सामान्य रूप से त्रुटि को संबोधित करता है न कि ओपी के सटीक कोड को। इस नोट का कोई जवाब नहीं मिला इसलिए मैंने सोचा कि मैं इसे जोड़ता हूं।

नीचे दिया गया कोड भी वही त्रुटि उत्पन्न करेगा :

class Actor {
    let agent : String? // BAD! // Its value is set to nil, and will always be nil and that's stupid so Xcode is saying not-accepted.  
    // Technically speaking you have a way around it🤓, you can help the compiler and enforce your value as a constant. See Option3
}

दूसरों ने उल्लेख किया कि या तो आप इनिशलाइज़र बनाते हैं या आप उनका उपयोग करके वैकल्पिक प्रकार बनाते हैं! या? क्या सही है। हालाँकि यदि आपके पास कोई वैकल्पिक सदस्य / संपत्ति है, तो वह विकल्प परस्पर होना चाहिए var। अगर आप letऐसा करेंगे तो यह कभी भी अपने nilराज्य से बाहर नहीं निकल पाएगा । यह बुरी बात है!

तो यह लिखने का सही तरीका है:

विकल्प 1

class Actor {
    var agent : String? // It's defaulted to `nil`, but also has a chance so it later can be set to something different || GOOD!
}

या आप इसे लिख सकते हैं:

विकल्प 2

class Actor {
let agent : String? // It's value isn't set to nil, but has an initializer || GOOD!

init (agent: String?){
    self.agent = agent // it has a chance so its value can be set!
    }
}

या इसे किसी भी मूल्य पर डिफ़ॉल्ट करें (जिसमें nilथोथा बेवकूफ है)

Option3

class Actor {
let agent : String? = nil // very useless, but doable.
let company: String? = "Universal" 
}

यदि आप इस बात से उत्सुक हैं कि क्यों let(इसके विपरीत var) को यहाँ और यहाँnil पढ़ने के लिए आरंभिक नहीं किया गया है


2
इसे जोड़ने के लिए धन्यवाद क्योंकि यह चित्र का एक महत्वपूर्ण हिस्सा था।
जिम

अच्छा समझाया !!
महेंद्र

1
शून्य पर सेट करना बेवकूफी नहीं है, लेकिन यह अंतर्निहित है कि कितने मॉडल काम करते हैं।
drew ..

@ ड्रू .. कुछ अपरिवर्तनीय सेट करना nilबहुत गलत है। एक की स्थापना varकरने के लिए nilएक अलग बात है।
हनी

हे हनी, जो अपरिवर्तनीय वस्तुओं के लिए बोल रहा था?
आकर्षित किया।

10

मेरे मामले में मैंने Boolइस तरह की घोषणा की है :

var isActivityOpen: Bool 

यानी मैंने इसे बिना सोचे-समझे घोषित कर दिया, यह है कि मैंने ( कोई शुरुआती ) त्रुटि कैसे हल की :

var isActivityOpen: Bool!

1

आपके प्रश्न का कोई विशिष्ट उत्तर नहीं है, लेकिन मुझे यह त्रुटि तब मिली थी जब मैंने इसे संपत्ति घोषित करते हुए एक एनम के लिए प्रारंभिक मूल्य निर्धारित नहीं किया था। मैंने इस त्रुटि को हल करने के लिए एनम को एक प्रारंभिक मूल्य सौंपा। यहां पोस्टिंग के रूप में यह किसी की मदद कर सकता है।


0

बस होमसेल क्लास के लिए इनिट ब्लॉक प्रदान करें

यह मेरे मामले में काम है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.