2014-06-14 8 views
20

एक स्विफ्ट वर्ग एक Obj सी आधारित ढांचे से प्राप्त के भीतर (लेकिन बस के रूप में आसानी से एक @objc विशेषता के साथ एक स्विफ्ट वर्ग हो सकता है) मैं दो संग्रहीत गुण की घोषणा:क्या स्विफ्ट वैकल्पिक इंट (इंट?) ब्रिजिंग के माध्यम से उद्देश्य-सी के संपर्क में आ सकता है?

var optInt: Int? 
var optString: String? 

केवल optString Obj से अवगत कराया जा रहा है जेनरेट किए गए -Swift.h हेडर के माध्यम से।

स्ट्रिंग? संभवतः ठीक है क्योंकि यह एक एनएसएसटींग ऑब्जेक्ट का उपयोग करके उजागर होता है जो शून्य हो सकता है, इसलिए ब्रिजिंग के पास कोई मूल्य प्रदर्शित करने का कोई तरीका नहीं है।

अगर मैं हटा देता हूं? ऑप्टिंट से यह एक एनएसआईएनटेगर प्रकार के संपर्क में है, इसलिए मैं देख सकता हूं कि गैर-वैकल्पिक पूर्णांक के लिए यह वस्तुओं और पुलों के मूल्य प्रकार से मूल्य प्रकार से बचाता है, लेकिन क्या इसका शाब्दिक अर्थ यह है कि एक इंट? खुलासा नहीं किया जा सकता है?

मुझे ऐसा कोई प्रलेखन नहीं मिल रहा है जो स्पष्ट रूप से कहता है कि यह मामला है। यहां असंगत स्विफ्ट सुविधाओं की एक पूरी सूची है जो यह दिखाई नहीं देती है: Using Swift from Objective-C

यहां उपयोग का मामला क्लासिक स्थिति है जो एक संख्यात्मक आईडी के उत्तीर्ण होने की आवश्यकता होती है जो वैध रूप से शून्य हो सकती है। पूर्व-स्विफ्ट दुनिया में एनएसएनंबर और शून्य बिल्कुल ठीक है कि मैं इसे कैसे कार्यान्वित करने के लिए चला गया, लेकिन स्विफ्ट में कक्षा को माइग्रेट करने का प्रयास करना गलत लगता है लेकिन फिर विशेष रूप से इस कारण से स्विफ्ट क्लास के भीतर ओब्जे-सी प्रकारों पर लटक रहा है।

मुझे लगता है कि मैंने कल्पना की थी कि एक इंट? इंटेल के विपरीत पृष्ठभूमि में एनएसएनंबर के रूप में पुल होगा, इसके संभावित रूप से शून्य मूल्य को स्विफ्ट में वैकल्पिक के "कोई मूल्य नहीं है" तत्व को खिलाया जाएगा।

क्या मुझे कुछ भी याद आ रही है? दोहराने के लिए, क्या एक स्विफ्ट वैकल्पिक इंट (इंट?) ब्रिजिंग के माध्यम से उद्देश्य-सी के संपर्क में आ सकता है?

+3

मैं 'एक' intValue' के साथ अंदर की कोशिश करेगा NSNumber'। – dasblinkenlight

+1

यदि जेनरेट हेडर उस संपत्ति के साथ कुछ नहीं कर रहा है, तो ऐसा लगता है कि उत्तर "नहीं" है। चूंकि स्विफ्ट को अंतिम रूप दिया नहीं गया है, हालांकि, अगर आपको लगता है कि एक समझदार दृष्टिकोण है तो ऐप्पल के साथ एक बग फाइल करें। (इसे 'NSNumber *' के रूप में उजागर करने में समस्या यह है कि आप उद्देश्य-सी से गैर-'INT'- संगत 'NSNumber' स्टोर कर सकते हैं।) –

+1

आप एक' गणना 'एनएसएनंबर? 'संपत्ति को अपने' Int? 'संपत्ति। गेटर बस 'Int? 'चर वापस कर देगा। सेटर 'Int' वैरिएबल को '- [NSNumber integerValue]' से सेट करेगा। –

उत्तर

7

NSNumber* के रूप में एक Int? संपत्ति उजागर के साथ समस्या यह है कि आप ऑब्जेक्टिव-सी से एक गैर Int संगत NSNumber इसे करने के लिए स्टोर कर सकता है।

आप NSNumber? संपत्ति को Int? संपत्ति को लपेटने के लिए एक गणना कर सकते हैं। गेटर बस Int? चर वापस कर देगा। सेटर -[NSNumber integerValue] से परिवर्तनीय सेट करेगा।

5

यहाँ समाधान ऊपर वर्णित के लिए एक ठोस जवाब है:

private var _number: Int? 
public var number: NSNumber? { 
    get { 
     return _number as NSNumber? 
    } 
    set(newNumber) { 
     _number = newNumber?.intValue 
    } 
} 

// In case you want to set the number in the init 
public init(number: NSNumber?) { 
    _number = number?.intValue 
} 
संबंधित मुद्दे