2015-02-09 10 views
10

के साथ एक वस्तु वर्ग बनाने मैं इस वर्ग मेरी वस्तु के लिए शहरiOS: स्विफ्ट

class City: NSObject { 

    var _name:String = "" 
    var name:String { 
     get { 
      return _name 
     } 
     set (newVal) { 
      _name = newVal 
     } 
    } 
} 

तो बनाया जब मैं टोकरा मेरी वस्तु मुझे क्या करना:

var city:City! 

city.name = "London" //crash here 

println("name city is\(city.name)"); 

यह दुर्घटना जब मैं के साथ नाम सेट संदेश "घातक त्रुटि: वैकल्पिक मूल्य को अनदेखा करते समय अनपेक्षित रूप से पाया गया शून्य"

उत्तर

17

यह वास्तव में एक जवाब (जैसे कि @ ग्रेग के और @ zelib के रूप में एक समाधान के लिए अन्य उत्तर, देखें), लेकिन अपने कोड

  1. बनाने की आवश्यकता में कुछ गलतियों को मैं देख रहा हूँ ठीक करने के लिए का प्रयास नहीं है अभिकलन + संग्रहीत संपत्ति (जब तक आप उस के लिए एक कारण है):

    class City: NSObject { 
        var name: String = "" 
    } 
    
  2. आप NSObject से विरासत हैं, तो आप स्वचालित रूप से सभी तेज सुविधाओं को खो - यह से बचने के (जब तक आप उस के लिए एक कारण है)

    class City { 
        var name: String = "" 
    } 
    
  3. आप मूल्य के अभाव के रूप में एक खाली स्ट्रिंग का उपयोग कर रहे हैं - तेजी से खास मतलब

    class City { 
        var name: String? 
    } 
    
  4. वैकल्पिक 3. करने के लिए, किसी नाम के बिना शहर नहीं होगा के लिए optionals प्रदान करता है, ताकि आप शायद प्रत्येक उदाहरण का नाम होना चाहिए। गैर वैकल्पिक संपत्ति और एक प्रारंभकर्ता का उपयोग करें:

    class City { 
        var name: String 
        init(name: String) { 
         self.name = name 
        } 
    } 
    
  5. बचें परोक्ष unwrapped optionals (जब तक आप उस के लिए एक कारण है):

    var city: City 
    
+0

यह वास्तव में एक जवाब नहीं है! – D4ttatraya

5

आपने शहर परिवर्तनीय प्रारंभ नहीं किया है और जब आप इसे उपयोग करने का प्रयास कर रहे हैं तो यह क्रैश हो गया है।

पहले यह आरंभ करने से पहले आप इसे उपयोग:

city = City() 
city.name = "London" 
2

क्योंकि आप अपने शहर चर आरंभ नहीं कर रहे हैं के बजाय आप सिर्फ परोक्ष यह किसी भी स्तर पर आरंभ बिना खोलने आपको त्रुटि हो रही है। इसे आरंभ करने के लिए आपको निम्नलिखित कोड

var city:City = City() 
1

आपको इनिट विधि को कॉल करना होगा। तो अगर आप इसे इस तरह करना होगा:

var city:City=City() //Calls init and creates an instance 
city.name="foo" 

आप एक init विधि को परिभाषित नहीं है (यह हमेशा एक अच्छा अभ्यास तुम क्या है कि है), डिफ़ॉल्ट init विधि कहा जाता है।

0

मूल्य के साथ एक वस्तु बना

var cityName = City("cityName")// create a object with string value 
6

किसी अन्य ऑब्जेक्ट उन्मुख प्रोग्रामिंग की तरह भाषा, और वस्तु को एक्सेस करने से पहले शुरू किया जाना चाहिए।
तरह:

var city:City! 

इस वस्तु का सिर्फ संदर्भ है। तो, वास्तविक स्मृति यहां नहीं बनाई गई है। आपको सिटी क्लास के लिए वास्तविक वस्तु बनाने की जरूरत है।

इसे ठीक बयान निम्न को जोड़कर:

city = City()