2014-11-14 6 views
10

सी ++ से आ रहा है, मैं स्विफ्ट में कुछ मेटाप्रोग्रामिंग करने की कोशिश कर रहा हूं। उदाहरण के लिए, मैं एक मेटाफंक्शन लागू करना चाहता हूं जो दो संख्याओं को जोड़ता है। मैं कुछ इस तरह की कोशिश की है:स्विफ्ट में मेटाप्रोग्रामिंग

protocol IntWrapper { 
    class var value: Int { get } 
} 

struct A: IntWrapper { 
    static let value = 5 
} 

struct B: IntWrapper { 
    static let value = 7 
} 

struct Sum<T: IntWrapper, U: IntWrapper>: IntWrapper { 
    static let value = T.value + U.value 
} 

लेकिन यह काम नहीं करता है: (। या बस दुर्घटनाओं, कभी कभी) Xcode शिकायत है कि T.Type एक सदस्य value नहीं है

कैसे लागू कर सकते हैं ऐसी कार्यक्षमता?

+0

अरे सर .... लगभग एक साल बाद ... क्या हमारे पास स्विफ्ट और मेटाप्रोग्रामिंग के बारे में कोई खबर है? –

उत्तर

8

static संग्रहीत गुण जेनेरिक वस्तुओं पर समर्थित नहीं हैं (वर्तमान में)। जब मैं एक खेल के मैदान में अपने कोड डाल दिया, मैं वास्तव में इस त्रुटि मिलती है:

Playground execution failed: <EXPR>:23:5: error: static variables not yet supported in generic types 
    static let value = T.value + U.value 
    ^~~~~~ 

आप के आसपास मिल सकती है कि बजाय (हो सकता है जो क्या तुम वैसे भी पहली जगह में करना चाहता था) एक गणना संपत्ति का उपयोग करके:

struct Sum<T: IntWrapper, U: IntWrapper>: IntWrapper { 
    static var value: Int { 
     return T.value + U.value 
    } 
} 

नोट: चूंकि यह एक गणना संपत्ति है, तो आप var और नहीं let साथ value घोषित करने के लिए की जरूरत है।

उन परिवर्तनों के साथ, println(Sum<A, B>.value) प्रिंट 12 जैसा कि आप उम्मीद करेंगे।

+0

ईमानदार होने के लिए, मुझे सच में यकीन नहीं है कि मैं क्या चाहता था (भाषा अर्थशास्त्र अर्थ में)। अंतिम लक्ष्य यह है कि एक बार सभी अनुकूलन सक्षम होने के बाद, परिणामी बाइनरी कोड में ' .value' स्थिर हो जाएगा। –

0

ऐसा लगता है कि आपको अपनी परिभाषाओं से मेल खाना और प्रोटोकॉल को अलग-अलग लागू करना होगा। (मैं एक तेज डेवलपर नहीं कर रहा हूँ, लेकिन जैसा कि मैंने stackoverflow पर लोगों की मदद मैं सीख रहा हूँ।)

protocol IntWrapper { 
    static var value : Int { get } 
} 
struct A: IntWrapper { 
    static var value : Int { get { 5 } } 
} 

आप एक class var के लिए बुला रहे थे, लेकिन उसके बाद आप एक static let परिभाषित किया। सूक्ष्म अंतर, लेकिन मुझे लगता है कि यह यहां मायने रखता है।

+0

प्रोटोकॉल में स्थैतिक गुण नहीं हो सकते हैं, यदि आप कोशिश करते हैं तो संकलक एक त्रुटि संदेश फेंकता है। –

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