2015-03-31 10 views
7

के खिलाफ कोको बाइंडिंग का उपयोग कैसे करें मैं स्विफ्ट सीख रहा हूं।स्विफ्ट structs

मैं ज्यादातर इन दिनों आईओएस में काम करते हैं, लेकिन मैं इस समय मैं कोको बाइंडिंग का उपयोग कर पसंद UI तत्व करने के लिए अपने मॉडल से मूल्यों से जोड़ने के लिए पर OSX ओएस एक्स

के लिए एक छोटे से परियोजना पर काम कर रहा हूँ। यह गोंद कोड के टन लिखने बचाता है।

मैं एक प्रोग्राम लिख रहा हूं जो स्विफ्ट के प्रदर्शन की तुलना सी/उद्देश्य-सी के साथ करता है। मैं एक प्राइम नंबर जनरेटर का परीक्षण परियोजना के रूप में उपयोग कर रहा हूं।

मैंने एक स्विफ्ट स्ट्रक्चर ComputeSettings बनाया है जो स्विफ्ट और ऑब्जेक्टिव-सी दोनों में प्राइम नंबर जनरेटर चलाने के लिए सेटिंग्स (और परिणाम) को समाहित करता है।

struct ComputeResults 
{ 
    var totalCalculated: Int = 0 
    var primesPerSecond: Int = 0 
    var totalTime:  NSTimeInterval = 0 
} 
struct ComputeSettings 
{ 
    var totalToCalculate: Int = 10000000 
    var swiftResults:  ComputeResults = ComputeResults() 
    var objCResults:  ComputeResults = ComputeResults() 
} 

मैं तो मेरे विचार नियंत्रक में टाइप ComputeSettings का एक उदाहरण चर है: struct इस तरह दिखता है

class ViewController: NSViewController 
{ 
    var theComputeSettings = ComputeSettings() 
    var foo: Int = 12 
    //... 
} 

मेरी UI में, मैं उपयोगकर्ता इनपुट संख्या देता है कि एक पाठ क्षेत्र है गणना करने के लिए प्रमुख संख्याओं का। आईबी में, मैं फ़ील्ड का चयन करता हूं, उपयोगिता क्षेत्र में बाइंडिंग टैब का चयन करता हूं, फिर मान बाइंडिंग खोलता हूं। मैं अपने ViewController कक्षा से बांधता हूं। मैं self.theComputeSettings.totalToCalculate का मॉडल कुंजी पथ दर्ज करता हूं।

यह एक अपवाद के साथ विफल रहता है जब मैं अपने प्रोजेक्ट को चलाने:

(contentViewController) उपयोगकर्ता पर (NSWindow) का निरीक्षण किया संपत्ति परिभाषित सेट करने में विफल: [addObserver: forKeyPath: @ "theComputeSettings.totalToCalculate" विकल्प : 256 संदर्भ: 0x0] उस ऑब्जेक्ट को भेजा गया था जो "thecomputeSettings" संपत्ति के लिए केवीसी-अनुरूप नहीं है।

, तो इसके बजाय, मैं डमी संपत्ति foo (ताकि मॉडल कुंजी पथ self.foo पर सेट है) यह पूरी तरह से काम करता है करने के लिए बाध्य। उस स्थिति में मुझे लगता है कि मेरा टेक्स्ट फ़ील्ड 12 का मेरा मान प्रदर्शित करता है।

स्विफ्ट structs का उपयोग करने के लिए कोई तरीका है और अभी भी कोको बाइंडिंग काम करने के लिए मिलता है? मैंने गुगलिंग की उचित मात्रा में काम किया, लेकिन कुछ भी नहीं मिला।

मैं निश्चित रूप से इसे मैन्युअल तरीके से कर सकता हूं, और अपनी खिड़की के विचारों में अपनी संरचनाओं से अपने मूल्य स्थापित करने के लिए गोंद कोड का एक गुच्छा लिख ​​सकता हूं, लेकिन मैं कोको बाइंडिंग का उपयोग करना चाहता हूं। यही वह है जो वे हैं।

उत्तर

9

आप स्विफ्ट structs के साथ कोको बाइंडिंग का उपयोग नहीं कर सकते हैं।

कोको बाइंडिंग सिस्टम कुंजी-मूल्य निरीक्षण के शीर्ष पर लागू किया गया है, और कुंजी-मूल्य निरीक्षण को उपरोक्त वस्तु को भेजे गए set<Property>: संदेशों को रोकने के लिए उप-वर्ग बनाने के द्वारा कार्यान्वित किया गया है। स्विफ्ट structs में subclasses नहीं हो सकते हैं और आवश्यक रूप से संरचना फ़ील्ड सेट करने के लिए संदेशों या फ़ंक्शन कॉल का उपयोग नहीं करते हैं, इसलिए स्विफ्ट स्ट्रक्चर फ़ील्ड की सेटिंग को अवरुद्ध करने के लिए सामान्य रूप से कोई तरीका नहीं है।

संदेश केवीसी अनुपालन की कमी के बारे में शिकायत करता है क्योंकि कुंजी-मूल्य कोडिंग संदेश नामों के लिए set<Property>: (और <property> गेटर) सम्मेलन को परिभाषित करता है।

+0

अच्छी पू। यह एक गंभीर सीमा की तरह लगता है।क्या एक केवीओ-अनुरूप सेट विधि को कॉल करने के लिए एक स्विफ्ट किए गए सेटसेट विधि को मानचित्रित करने के लिए structs और/या structs पर आदिम मूल्यों पर श्रेणियों को लागू करना संभव होगा? मैं 500 एलबीएस लिखने के बीच में हूँ। मेरे क्षेत्रों में मूल्यों को पढ़ने/प्रदर्शित करने के लिए गोंद कोड का। कोको बाइंडिंग ओएस एक्स विकास के बारे में बेहतर चीजों में से एक है। मैं वास्तव में उनको बहुत अधिक उपयोग करता हूं, भले ही इसका मतलब कुछ भारी उठाना है। –

+0

ComputeResults को संरचना क्यों होना चाहिए? क्या यह वास्तव में आपके द्वारा प्रोफाइल किए जा रहे कोड का हिस्सा है? –

+0

यह ** ** एक संरचना होने के लिए ** नहीं है। यह डेटा का प्रतिनिधित्व करने का सबसे साफ तरीका प्रतीत होता था। मुझे लगता है कि मैं इसे एक कस्टम डेटा ऑब्जेक्ट में बदल दूंगा, क्योंकि ऑब्जेक्ट्स पर गुण केवीओ अनुपालन होना चाहिए, है ना? –

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