2015-12-22 11 views
9

स्विफ्ट में दिए गए प्रोटोकॉल को लागू करने वाले सभी वर्गों को कैसे सूचीबद्ध करें?स्विफ्ट में प्रोटोकॉल के अनुरूप सभी कक्षाओं को कैसे सूचीबद्ध करें?

कहते हैं कि हम एक उदाहरण है:

protocol Animal { 
    func speak() 
} 

class Cat:Animal { 
    func speak() { 
     print("meow") 
    } 
} 

class Dog: Animal { 
    func speak() { 
     print("Av Av!") 
    } 
} 

class Horse: Animal { 
    func speak() { 
     print("Hurrrr") 
    } 
} 

यहाँ मेरे वर्तमान (compilable नहीं) दृष्टिकोण है:

func getClassesImplementingProtocol(p: Protocol) -> [AnyClass] { 
    let classes = objc_getClassList() 
    var ret = [AnyClass]() 

    for cls in classes { 
     if class_conformsToProtocol(cls, p) { 
      ret.append(cls) 
     } 
    } 
    return ret 
} 

func objc_getClassList() -> [AnyClass] { 
    let expectedClassCount = objc_getClassList(nil, 0) 
    let allClasses = UnsafeMutablePointer<AnyClass?>.alloc(Int(expectedClassCount)) 
    let autoreleasingAllClasses = AutoreleasingUnsafeMutablePointer<AnyClass?>(allClasses) 
    let actualClassCount:Int32 = objc_getClassList(autoreleasingAllClasses, expectedClassCount) 

    var classes = [AnyClass]() 
    for i in 0 ..< actualClassCount { 
     if let currentClass: AnyClass = allClasses[Int(i)] { 
      classes.append(currentClass) 
     } 
    } 

    allClasses.dealloc(Int(expectedClassCount)) 

    return classes 
} 

लेकिन जब बुला या तो

getClassesImplementingProtocol(Animal.Protocol) या

getClassesImplementingProtocol(Animal) या

Xcode त्रुटि में

getClassesImplementingProtocol(Animal.self)

परिणाम: उम्मीद तर्क प्रकार 'प्रोटोकॉल' के लिए के प्रकार (Animal.Protocol) .Type मूल्य परिवर्तित नहीं कर सकते।

क्या कोई भी यह काम कर रहा है?

@objc protocol Animal { 
    func speak() 
} 

class Cat:Animal { 
    @objc func speak() { 
    print("meow") 
    } 
} 

class Dog: Animal { 
    @objc func speak() { 
    print("Av Av!") 
    } 
} 

class Horse: Animal { 
    @objc func speak() { 
    print("Hurrrr") 
    } 
} 

ध्यान दें कि प्रकार आत्मनिरीक्षण इस तरह की बहुत धीमी गति से हो सकता है:

+0

त्रुटि में कौन सी रेखा होती है? – luk2302

+0

मुझे लगता है कि यह आपके लिए सहायक हो सकता है: http://stackoverflow.com/questions/28124684/swift-check-if-generic-type-conforms-to-protocol –

उत्तर

4
आप ऑब्जेक्टिव-सी क्रम का उपयोग कर रहे चूंकि प्रकार आत्मनिरीक्षण आप इस तरह से अपने कोड में @objc जोड़ने की जरूरत है पाने के लिए

+0

धन्यवाद ब्रूनो, यह काम करता है। प्रदर्शन के संबंध में, मैंने इसे अभी मापा है: आईपैड 3 (जिसे मैं धीमी उपकरणों में से एक के रूप में मानता हूं) पर 'getClassesImplementingProtocol' कॉल के लिए ca 115ms लेता है, जबकि iPhone6S पर यह 12ms लगता है। मेरे लिए, यह ऐप स्टार्टअप पर एक बार निष्पादित किया जाता है, इसलिए प्रदर्शन एक महत्वपूर्ण मुद्दा नहीं है। – mixtly87

+0

जितना धीमा नहीं था उतना धीमा नहीं, इसलिए यह अच्छी बात है! मुझे खुशी है कि यह आपके लिए काम करता है। – ColGraff

+1

संरचनाओं के साथ कुछ पाने के लिए कोई तरीका है? –

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