स्विफ्ट union
जैसे "असुरक्षित" प्रोग्रामिंग पैटर्न को हतोत्साहित करता है, हालांकि, एक कामकाज है। यह एक सा बदसूरत है, लेकिन यहां (Xcode 7.2 का प्रयोग करके) जाता है ...
struct VariantA {
var oneField: Int // 8 bytes
struct VariantB {
var firstField: UInt32 // first 4 bytes
var secondField: UInt32 // second 4 bytes
}
var variantB: UnsafeMutablePointer<VariantB> {
mutating get {
func addressOf<U>(something:UnsafePointer<U>)
-> UnsafeMutablePointer<VariantB> {
return UnsafeMutablePointer<VariantB>(something)
}
return addressOf(&oneField)
}
}
}
अब sizeof(VariantA)
की एक त्वरित जांच (जो एक 64-बिट पूर्णांक) दिखाएगा पूरी संरचना अभी भी केवल आठ बाइट्स लेता है। अगर हम अब इस var a = VariantA(oneField: 1234567890987654321)
जैसे उदाहरण बनाते हैं तो हम इस a.oneField
जैसे घटकों से पूछ सकते हैं जो प्रारंभिक मान 1,234,567,890,987,654,321 और a.variantB.memory.firstField
वापस कर देंगे 2,976,652,465 और a.variantB.memory.secondField
वापस 287,445,236 लौटाएंगे।
हम इस a.variantB.memory.firstField++
तरह घटकों में से एक को बदल सकते हैं और उसके बाद देख सकते हैं कि इस 1,234,567,890,987,654,32 करने के लिए a.oneField
के मूल मूल्य में परिवर्तन के रूप में उम्मीद।
मेरे लिए बदसूरत भाग "असुरक्षित", "सूचक" और .memory.
शब्दों के साथ-साथ addressOf
सहायक फ़ंक्शन जो एक्सकोड 7.2 में एक कंपाइलर त्रुटि को दूर करने के लिए केवल वहां हैं!
शायद निम्न स्तर की संरचनाओं के साथ काम करना जिसके लिए बाइट-स्तरीय हेरफेर की आवश्यकता होती है, इसे स्विफ्ट जैसी उच्च स्तरीय भाषा में नहीं किया जाना चाहिए। क्या आपने अपनी परियोजना के इस हिस्से को .c फ़ाइल में लिखने पर विचार किया है? एक उपयुक्त ब्रिजिंग हेडर के साथ आप अभी भी स्विफ्ट में अपनी अधिकांश परियोजनाएं कर सकते हैं।
स्रोत
2015-12-29 16:20:04
स्विफ्ट में यूनियनों का कोई प्रत्यक्ष समर्थन नहीं है, लेकिन आप अपनी आवश्यकता को पूरा करने के लिए गणना का उपयोग कर सकते हैं। – Amit89
यूनियनों को केवल हर सी और सी ++ कोडिंग मानक द्वारा मनुष्यों को पता चला है क्योंकि उन्हें गैर-पोर्टेबल कोड लिखने के लिए अक्सर उपयोग किया जाता है। यदि आपके पास इस मामले में कोई विकल्प है, तो कभी भी सी में 'यूनियन' का उपयोग न करें, और सभी मामलों में बिट-वार ऑपरेटरों के साथ जो भी डेटा शामिल है, उसे अनपैक करें। – marko
@marko, मुझे आपके आधार से असहमत होना होगा। उदाहरण के लिए, संदेश प्राप्त करते समय, जहां संदेश में कई अलग-अलग प्रारूप हो सकते हैं, यह लगभग हमेशा उन प्रारूपों के संघ के रूप में लागू होता है, आमतौर पर जहां पहला, गैर हेडर, फ़ील्ड इंगित करता है कि शेष संदेश किस प्रकार का है संदेश, जहां शेष संदेश सभी संदेश प्रकारों के संघ के रूप में परिभाषित किया गया है। – user3629249