2015-02-10 10 views
24

द्वारा अनुमति नहीं है मैं पार्स का उपयोग कर रहा हूं और मैं प्रोटोकॉल PFSubclassing के अनुरूप एक PFObject सबक्लास बना रहा हूं! यह सब ठीक काम कर रहा था, लेकिन अब मैं स्विफ्ट 1.2 का उपयोग कर रहा है और यह मुझे इस त्रुटि देता है:विधि लोड() उद्देश्य-सी क्लास विधि 'लोड' को परिभाषित करता है, जिसे स्विफ्ट 1.2

1. override class func load() { 
2.  self.registerSubclass() 
3. } 

लाइन 1 पर: विधि 'लोड()' को परिभाषित करता है ऑब्जेक्टिव-सी वर्ग विधि 'लोड' है, जो स्विफ्ट 1.2

द्वारा किसी की भी अनुमति नहीं है? मैं कैसे ठीक कर सकता हूं?

override class func initialize() { 
} 
+0

आप वास्तव में '' func' के बजाय function' कह रहे हैं? क्या यह किसी प्रकार की पार्स चीज है? – matt

उत्तर

15

वहाँ विधि swizzling के बारे में एक NSHispster लेख है कि अलग संदर्भ में इस पर छू लेती है:

Unfortunately, a load class method implemented in Swift is never called by the runtime, rendering that recommendation an impossibility. Instead, we're left to pick among second-choice options:

  • Implement method swizzling in initialize. This can be done safely, so long as you check the type at execution time and wrap the swizzling in dispatch_once (which you should be doing anyway).

  • Implement method swizzling in the app delegate. Instead of adding method swizzling via a class extension, simply add a method to the app delegate to be executed when application(_:didFinishLaunchingWithOptions:) is called. Depending on the classes you're modifying, this may be sufficient and should guarantee your code is executed every time.

लिंक: http://nshipster.com/swift-objc-runtime/

-

अधिक जानकारी प्रपत्र देव मंचों:

Swift 1.1 allowed you to define "+load" methods with "class func load()", but they were not actually run at startup time of your app like Objective-C +load methods are. Swift 1.2 bans them to avoid the impression that this might work.

लिंक: https://devforums.apple.com/message/1102025#1102025

-

tl; डॉ initialize() और didFinishLaunchingWithOptions स्विफ्ट में ऐसी बातों के लिए सभ्य स्थानों होने लगते हैं।

+0

सबसे पूरा उत्तर, इसलिए मैंने आधिकारिक उत्तर के रूप में चिह्नित किया! धन्यवाद दोस्त! – txaidw

5

मैं इसके साथ यह बदल कर काम कर गया।

+4

ध्यान दें कि '+ लोड' और' प्रारंभिक 'अलग हैं। बाइनरी लोड होने के समय 'लोड 'चलता है, भले ही कक्षा का उपयोग किया जाता है; और आपके पास एकाधिक '+ लोड' विधियां हो सकती हैं - मुख्य श्रेणी के अलावा प्रत्येक श्रेणी में से एक - सभी एक दूसरे के साथ हस्तक्षेप किए बिना (आमतौर पर श्रेणी विधियां मौजूदा विधियों को उसी नाम से प्रतिस्थापित करती हैं)। दूसरी ओर, 'प्रारंभिक', क्लास पहली बार मैसेज होने पर आलसी चलता है। – newacct

+0

@newacct क्या आप भार के बराबर जानते हैं() स्विफ्ट में? अभी के लिए मैं ऊपर टिप्पणी के रूप में टिप्पणी छोड़ रहा हूं क्योंकि यह अब मेरी समस्या को हल करता है – txaidw

6

मैं PFObject के हर उपवर्ग के लिए Parse.setApplicationId से पहले AppDelegate में registerSubclass() विधि फोन कर रहा हूँ और यह काम करता है:

4

ओवरराइडिंग load()कभी स्विफ्ट के साथ काम किया। इरीर इसे बस नहीं बुलाया गया था। मैंने ऐप्पल के लिए एक बग दायर किया (बग आईडी 18423731), और हाल ही में मुझे एक प्रतिक्रिया मिली कि इस मुद्दे को स्पष्ट रूप से डेवलपर को सूचित करके संबोधित किया गया है कि स्विफ्ट में इसकी अनुमति नहीं है।

extension UIButton { 
    // !! never called 
    override public class func load() { // Method 'load()' defines Objective-C class method 'load', which is not permitted by Swift 1.2 
     super.load() 
     println("not called earlier anyway"); 
    } 
} 

तो .... नहीं। भले ही दस्तावेज़ अन्यथा कहता है।

6

इस प्रयास करें:

override class func initialize() { 
    var onceToken : dispatch_once_t = 0; 
    dispatch_once(&onceToken) { 
     self.registerSubclass() 
    } 
} 

पार्स प्रलेखन अद्यतन किया गया है: https://www.parse.com/docs/ios/guide#objects-subclassing-pfobject

+1

स्विफ्ट 1.2 के साथ: http://stackoverflow.com/a/29032615/1370156 –

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