2014-09-29 5 views
8

आज जब मैं अपने 'कोरडाटा आयात संचालन' को सामान्यीकृत करने की कोशिश कर रहा था, तो मैंने एक अजीब मुद्दा पूरा किया है। ऐसा प्रतीत होता है कि यदि मैं NSOperation का एक सामान्य उप-वर्ग बनाता हूं तो main() func नहीं कहा जाएगा।जेनेरिक एनएसओपरेशन सबक्लास एनएसओपरेशन कार्यक्षमता खो देता है

सरल उदाहरण:

class MyOperation<T: NSObject>: NSOperation { 

    override func main() { 
     println("My operation main was called") 
    } 
} 

आप इस वर्ग का एक उदाहरण बना सकते हैं और करने के लिए उसे जोड़ें operationQueue आप इसे main() वास्तव में नहीं बुलाया जाता है कि देखेंगे।

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    self.operationQueue = NSOperationQueue() 
    let operation = MyOperation<NSString>() 
    self.operationQueue!.addOperation(operation) 
} 

ऑपरेशन बस ready से executing करने और finished राज्य के लिए main() बुला बिना संक्रमण।

यदि मैं MyOperation कक्षा से सामान्य एनोटेशन <T: NSObject> हटा देता हूं तो यह ठीक काम करेगा।

यह कैसे संभव है? क्या मुझे यहां कुछ याद आ रही है?

उत्तर

7

समस्या इस सरल नियम के कारण होता है:

एक सामान्य वर्ग में विधि में नहीं दर्शाया जा सकता ऑब्जेक्टिव-सी

नतीजतन, जब को पाट ऑब्जेक्टिव-सी, MyOperation दिखता है शुद्ध की तरह, बिना किसी विधियों को ओवरराइड किया गया है, NSOperation सबक्लास।

@objc विशेषता के साथ override func main() को चिह्नित करके आप यह त्रुटि देख सकते हैं।

@objc override func main() { // < [!] Method in a generic class cannot be represented in Objective-C 
    println("My operation main was called") 
} 
+1

स्पष्टीकरण के लिए धन्यवाद। यह दुख की बात है कि हम उद्देश्य-सी के साथ स्विफ्ट में इतनी शक्तिशाली तकनीक का उपयोग नहीं कर सकते हैं। इस विशेष मामले में, 'सामान्यीकृत' संचालन कोड के कुछ हिस्सों का पुन: उपयोग करने में मदद कर सकता है। अच्छी तरह से हाँ। :/ – Nevs12

12

युक्ति: आप NSOperation उपवर्ग (कोई सामान्य) बना सकते हैं, मुख्य ओवरराइड और कॉल आप 'पर अमल' के मालिक हैं समारोह है, जो सामान्य उपवर्गों द्वारा ओवरराइड किया जा सकता है। उदाहरण:

class SwiftOperation : NSOperation { 

    final override func main() { 
     execute() 
    } 

    func execute() { 
    } 

} 

class MyOperation<T> : SwiftOperation { 

    override func execute() { 
     println("My operation main was called") 
    } 

} 
+0

बहुत बढ़िया, धन्यवाद! UIKit प्रतिनिधियों के लिए भी बहुत उपयोगी! – Ixx

+0

मैं एक सामान्य तालिका ViewDataSource को लागू करने के लिए इस विधि का उपयोग करता हूं – banxi1988

1

Xcode 7 में सामान्य NSOperation कर दिया गया है तय: अगर मैं एक खेल के मैदान में इस कोड को चलाने के काम करता है:

protocol SomeProtocol { 

    // markup protocol 
} 

class GenericOperation<SomeTypeImplementingProtocol: SomeProtocol>: NSOperation { 

    let referenceToSomeTypeImplementingProtocol: SomeTypeImplementingProtocol 

    init(referenceToSomeTypeImplementingProtocol: SomeTypeImplementingProtocol) { 

     self.referenceToSomeTypeImplementingProtocol = referenceToSomeTypeImplementingProtocol 
    } 

    override func main() { 

     debugPrint("The GenericOperation main() method was called.") 

    } 
} 

class TypeImplementingSomeProtocol: SomeProtocol { 


    init() { 

    } 
} 


let operationQueue = NSOperationQueue() 

let typeImplementingSomeProtocolInstance = TypeImplementingSomeProtocol() 


let operation = GenericOperation<TypeImplementingSomeProtocol>(referenceToSomeTypeImplementingProtocol: typeImplementingSomeProtocolInstance) 


operationQueue.addOperation(operation) 
संबंधित मुद्दे