2015-06-05 6 views
6
class MyClass { 
    private var _image: UIImage 

    var image: UIImage { 
     set { 
      if newValue == nil { 
       _image = UIImage(named: "some_image")! 
      } 
     } 
     get { 
      return _image 
     } 
    } 
} 

मेरा लक्ष्य गैर वैकल्पिक मूल्य गारंटी करने के लिए जब image, गेटर में गैर वैकल्पिक मूल्य लौटें जबकि सेटर में वैकल्पिक मूल्य

पहुँचा जा सकता है मैं अतिरिक्त समारोह के बिना इस लक्ष्य को हासिल कर सकते हैं की अनुमति?

यहां तक ​​कि अगर मैं didSet/willSet वे अभी भी है कि UIImage प्रकार करने के लिए बाध्य कर रहे हैं और मैं nil के लिए जाँच नहीं कर सकते हैं ...

उत्तर

4

लगता है जैसे आप एक स्पष्ट रूप से अनचाहे वैकल्पिक का उपयोग करना चाहते हैं। चूंकि आपका गेटटर एक गैर वैकल्पिक यूआईएममेज के लिए सिर्फ एक रैपर है, इसलिए आप जानते हैं कि आपका गेटर हमेशा एक गैर शून्य मूल्य उत्पन्न करेगा (और image के बाद से पूरी तरह से अनचाहे है, इसे इस तरह माना जाएगा), लेकिन यह आपके सेटटर को शून्य स्वीकार करने की अनुमति देगा मान। शायद इस तरह कुछ।

class MyClass { 
    private var _image: UIImage // ... 

    var image: UIImage! { 
     get { 
      return _image 
     } 

     set { 
      if let newValue = newValue { 
       _image = newValue 
      } else { 
       _image = UIImage(named: "some_image")! 
      } 
     } 
    } 
} 

कहाँ

image = nil 

_image अपने डिफ़ॉल्ट मान प्रदान करेंगे, और

image = UIImage(named: "something_that_exists")! 

_image को नई छवि प्रदान करेंगे। ध्यान दें कि यह आपको वैकल्पिक रूप से वैकल्पिक रूप से अनचाहे किए बिना UIImage(named:) से वैरिएबल को असाइन करने की अनुमति देता है। यदि UIImage का प्रारंभकर्ता विफल रहता है क्योंकि यह छवि नहीं ढूंढ पाता है, तो यह आपकी डिफ़ॉल्ट छवि को असाइन करने के लिए _image का विश्लेषण करेगा और फिर भी इसका कारण बन जाएगा।

+0

अच्छा! धन्यवाद..! – jovanMeshkov

0

तुम सिर्फ कर सकते हैं का उपयोग करें:

private var image: UIImage = UIImage(named: "some_image")! 

तो छवि आरंभ नहीं हो जाता एक डिफ़ॉल्ट छवि के साथ और यदि आप किसी दूसरे पर सेट नहीं करते हैं तो इस छवि का उपयोग किया जाएगा।

private var _image: UIImage? 

var image: UIImage? { 
    set { 
     if _image == nil { 
      _image = newValue 
     } 
    } 
    get { 
     return _image 
    } 
} 
+0

हम्म, मुझे लगता है कि यह काम नहीं करेगा ... मैं इस तरह कुछ हासिल करना चाहता हूं: सेट -> UIImage? {} प्राप्त करें -> UIImage {} मैं सेंट्रलाइज्ड प्रारंभकर्ता चाहता हूं, इसलिए यह जांचने के बिना शून्य मूल्य निर्धारित करना संभव हो सकता है कि उदाहरण के लिए कुछ प्राप्त डेटा शून्य है – jovanMeshkov

+0

मैं अपना उत्तर संपादित करता हूं, मुझे लगता है कि आप यही चाहते हैं केस – Icaro

+0

ठीक है, लेकिन अगर मैं myClassObject.image को कॉल करता हूं! मुझे इसे '!' से अनचाहे करने की आवश्यकता होगी ... मैं बस इसे सीधे एक्सेस करना चाहता हूं जैसे myClassObject.image: D – jovanMeshkov

0

आप कर सकते हैं अपने समर्थन चर (_image) वैकल्पिक है, तो आपके सार्वजनिक संपत्ति नहीं होगा। वापस लौटने के लिए यह निर्धारित करने के लिए नील कोलेसिंग ऑपरेटर (??) का उपयोग करें।

class MyClass { 
    private var _image: UIImage? 

    var image: UIImage { 
     set { _image = newValue } 
     get { return _image ?? UIImage(named: "some_image")! } 
    } 
} 
+0

इस तरह से मैं इसे myClassObject.image = nil के रूप में सेट करने में सक्षम नहीं हूं ... – jovanMeshkov

+0

आपने यह नहीं कहा था कि आप अपने प्रश्न में ऐसा करना चाहते हैं। –

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