2017-11-03 15 views
5

स्विफ्ट में आप किसी ऑब्जेक्ट को प्रारंभकर्ता को निजी बनाकर सीधे प्रारंभ करने से रोक सकते हैं। आप इसे फैक्टरी पैटर्न के साथ करना चाहेंगे।structs पर स्विफ्ट एक्सटेंशन निजी प्रारंभिक सुरक्षा असंभव बनाते हैं

लेकिन यदि आप कोई एक्सटेंशन बनाते हैं, तो आप एक अलग प्रारंभकर्ता प्रदान कर सकते हैं और यह संकलित करता है। इससे कोई फर्क नहीं पड़ता कि एक्सटेंशन एक ही फाइल में है या नहीं। उदाहरण के लिए, यदि आपकी फैक्ट्री विधि कुछ डेटा सत्यापन करता है तो इसका गंभीर परिणाम हो सकते हैं।

क्या मुझे निजी इनिट्स के बारे में कुछ याद आ रहा है? यह बहुत बुरा लगता है। क्या मैं इसे रोक सकता हूं?

struct Foo { 

    let data: Int 

    // factory method 
    static func makeFoo(data: Int) -> Foo { 
     return Foo(data: data) 
    } 

    // private init with data validation 
    private init(data: Int) { 
     guard data < 100 else { 
      fatalError("Foo should only have values under 100") 
     } 
     self.data = data 
    } 
} 

extension Foo { 
    init(someData: Int) { 
     // This bypasses the data validation and puts Foo into an invalid state. 
     self.data = someData 
    } 
} 
+1

हम्म में अनुमति नहीं दी जाएगी। मैं कहूंगा कि यह एक बग है। ऐसा लगता है कि आप या तो 'फू' कक्षा बनाकर या एक निजी क्षेत्र जोड़कर इसे प्राप्त कर सकते हैं। – Kevin

+0

हां एक निजी बैकिंग फ़ील्ड काम करता है, लेकिन केवल तभी जब यह एक अलग फ़ाइल में है। निश्चित रूप से वहाँ एक बग। – MH175

+2

आपकी समस्या का आधा ज्ञात लचीलापन बग है। ऐप्पल के जॉर्डन रोज़ का प्रस्ताव है [लागू करें कि क्रॉस-मॉड्यूल स्ट्रक्चर प्रारंभकर्ता एक और इन-मॉड्यूल स्ट्रक्चर प्रारंभकर्ता को कॉल करते हैं] (https://github.com/jrose-apple/swift-evolution/blob/restrict-cross-module-struct- प्रारंभकर्ता/प्रस्ताव/nnnn-restrict-cross- मॉड्यूल- संरचना-initializers.md), जो प्रारंभिक है अगर प्रारंभिक निजी हैं। – zneak

उत्तर

0

ऊपर zneak की टिप्पणी के अनुसार, इस स्विफ्ट 5.

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