मुझे NSSecurCoding और उसके उपवर्गों का उपयोग करने वाली कक्षाएं बनाने में समस्या हो रही है।

class ClassA: NSObject, NSSecureCoding {
    public static var supportsSecureCoding: Bool { return true }
}

class ClassB: ClassA {
    public static var supportsSecureCoding: Bool { return true } // "Cannot override static var"
}

मुझे इसे कॉल करना चाहिए क्योंकि NSObject.h में प्रलेखन कहता है,

इस संपत्ति को सुरक्षित कोडिंग की अनुमति देने वाले सभी वर्गों पर हाँ वापस करना होगा। कक्षाओं के उपवर्ग जो NSSecurCoding को अपनाते हैं और initWithCoder को ओवरराइड करते हैं: को भी इस पद्धति को ओवरराइड करना चाहिए और हाँ वापस करना चाहिए। // डेटा को डिकोड करने वाली विधियों को लिखते समय सिक्योर कोडिंग गाइड से परामर्श लिया जाना चाहिए।

उद्देश्य सी:

@property (class, readonly) BOOL supportsSecureCoding;

स्विफ्ट:

public static var supportsSecureCoding: Bool { get }

मैं एक्सकोड 10.0 का उपयोग कर रहा हूं, स्विफ्ट 4.0 और स्विफ्ट 4.2 दोनों पर कोशिश की। लोग इसके आसपास कैसे हो रहे हैं? किसी भी मदद की सराहना की जाती है।

अपडेट करें: public class var supportsSecureCoding का उपयोग करते समय, यह संकलित करता है लेकिन गति के लिए ऑप्टिमाइज़ का उपयोग किए जाने पर यह रनटाइम पर क्रैश हो जाता है।

3
Genki 27 सितंबर 2018, 23:12

3 जवाब

सबसे बढ़िया उत्तर

ऐसा लगता है कि स्विफ्ट का वर्तमान अनुकूलक ओवरराइड गेट्टर विधि उत्पन्न करने के लिए दबा देता है जब इसकी परिभाषा इसके सुपरक्लास के समान होती है। क्या चतुर अनुकूलक है !?

इस तरह की हैक इतनी मजबूत अनुकूलन को दबा देगी।

class ClassB: ClassA {

    //...

    static private var secureCoding = true
    override public class var supportsSecureCoding: Bool { return secureCoding }

}

static private let का समान प्रभाव नहीं होता है। इसलिए, जब स्विफ्ट ऑप्टिमाइज़र अधिक चतुर होता है, तो हो सकता है कि ऊपर दिया गया कोड काम न करे। बेहतर होगा कि जल्द ही एक बग रिपोर्ट भेजें।


ऐसा लगता है कि स्विफ्ट ऑप्टिमाइज़र पहले से ही काफी चतुर है और ऊपर दिया गया वर्कअराउंड काम नहीं कर सकता है। (मार्टिन आर की टिप्पणी देखें।)

आपको private को हटाना पड़ सकता है।

class ClassB: ClassA {

    //...

    static var secureCoding = true
    override public class var supportsSecureCoding: Bool { return secureCoding }

}
6
OOPer 30 सितंबर 2018, 22:32

static एक वर्ग घोषणा में final class के लिए एक उपनाम है, यानी एक प्रकार की विधि जिसे उपवर्ग में ओवरराइड नहीं किया जा सकता है। आप जो चाहते हैं वह एक class विधि है

public class var supportsSecureCoding: Bool { return true }

जिसे उपवर्ग में ओवरराइड किया जा सकता है

override public class var supportsSecureCoding: Bool { return true }
3
Martin R 27 सितंबर 2018, 23:24

फिक्स जो मेरे लिए काम किया

private static var secureCodingWorkaround = true
@objc override public class var supportsSecureCoding: Bool { return secureCodingWorkaround }
0
Alkenso 'Volodymyr Vashurkin' 20 नवम्बर 2018, 12:55