2015-09-05 29 views
5

में AnyClass का उपयोग कैसे करें मुझे अपने जेनेरिक बेस क्लास में एक प्रकार को पास करने की आवश्यकता है।स्विफ्ट जेनेरिक क्लास

class SomeBaseClass<T: AnyClass> { 
    // Implementation Goes here 
} 

मैं निम्नलिखित त्रुटि मिलती है:

Inheritance from non-protocol, non-class type 'AnyClass' (aka 'AnyObject.Type')

आदर्श रूप में मैं टी का उपयोग करने के बजाय AnyClass से एक विशेष प्रकार के रूप में होना चाहते हैं, लेकिन AnyClass रूप में अच्छी तरह ठीक है।

धन्यवाद

उत्तर

3

इसके बजाय T जरूरतों को निर्दिष्ट एक वर्ग होने के लिए की, आप के बजाय कर सकता है:

class SomeBaseClass<T> { 
    let type: T.Type 

    init(type: T.Type) { 
     self.type = type 
    } 
} 

आप T.Type का उपयोग करने की एक बहुत यह एक typealias का उपयोग कर लायक हो सकता है योजना बना रहे हैं:

class SomeBaseClass<T> { 
    typealias Type = T.Type 
    let type: Type 
    ... 
} 

कुछ उदाहरण उपयोग:

और इस विधि का लाभ T.Type structs और enums, साथ ही कक्षाओं का प्रतिनिधित्व कर सकता है।

+0

यह काफी रोचक है, मैं इसे आज़मा दूंगा। – Peymankh

+0

साफ। धन्यवाद, वह ऐसा करेगा। – Peymankh

1

यदि आप टाइप करना चाहते हैं तो आपको AnyObject का उपयोग करना चाहिए।

class SomeBaseClass<T: AnyObject> { 
    // Implementation Goes here 
} 

// Legal because UIViewController is a class 
let o1 = SomeBaseClass<UIViewController>() 

// Illegal (won't compile) because String is a struct 
let o2 = SomeBaseClass<String>() 
1

आप इस चाल कर सकते हैं:

protocol P {} 

class C: P {} 

class C1<T: P> {} 

let c1 = C1<C>() 

इस मामले में आप तो आप में सक्षम नई जेनेरिक वर्ग C1 बनाने के लिए जहां T अपने प्रोटोकॉल P है, प्रोटोकॉल P के साथ वर्ग C लपेट दें। यह आपको जेनेरिक पैरामीटर क्लास C के साथ C1 क्लास का उदाहरण बनाने की अनुमति देता है।

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