उदाहरण के सदस्य प्रकार पर इस्तेमाल नहीं किया जा सकता है


138

मेरे पास निम्न वर्ग है:

class ReportView: NSView {  
    var categoriesPerPage = [[Int]]()
    var numPages: Int = { return categoriesPerPage.count }
}

संदेश के साथ संकलन विफल रहता है:

इंस्टेंस सदस्य 'श्रेणियांप्रेजेज' का उपयोग 'ReportView' प्रकार पर नहीं किया जा सकता है

इसका क्या मतलब है?


12
आप numPagesएक बंद होने के बजाय एक समान संपत्ति घोषित करने जा रहे हैं , तो समान चिह्न हटा दें:var numPages: Int { return categoriesPerPage.count }
vadian

1
कृपया इसे और अधिक अच्छी तरह से समझाया जा सकता है कि इस त्रुटि संदेश का क्या मतलब है? मैं इसे बिल्कुल अलग संदर्भ में देख रहा हूं।
विलियम एंट्रीकेन

2
जब आप ऊपर की तरह वर्ग के दायरे में एक ब्लॉक की घोषणा करते हैं, तो आप सीमित हैं जो कि प्रकार में उपलब्ध है। आपके पास किसी भी उदाहरण के सदस्यों तक पहुंच नहीं है।
एंडरस्टेड

नोट: त्रुटि संदेश आपके द्वारा प्राप्त किए जाने के समान है, जब आप आलसी चर बनाने की कोशिश कर रहे हैं, लेकिन आवश्यकताओं में से एक को भूल गए हैं । अपने मामले में आप एक आलसी चर नहीं चाहते हैं categoriesPerPageक्योंकि varइसके बजाय के रूप में परिभाषित किया गया है let
सेंसफुल जूल

1
निकालें = से: var संख्या: Int =
andrewz

जवाबों:


132

आपके पास कहने के दौरान सिंटैक्स त्रुटि है = {return self.someValue}=जरूरत नहीं है।

उपयोग :

var numPages: Int {
    get{
        return categoriesPerPage.count
    }

}

यदि आप चाहते हैं कि आप केवल लिख सकें

var numPages: Int {
     return categoriesPerPage.count
}

पहला रास्ता साथ तुम भी रूप में पर्यवेक्षकों जोड़ सकते हैं set willSetऔरdidSet

var numPages: Int {
    get{
        return categoriesPerPage.count
    }
    set(v){
       self.categoriesPerPage = v
    }
}

= operatorसेटर के रूप में उपयोग करने की अनुमति

myObject.numPages = 5

1
उफ़, मैं बराबर साइन करने से चूक गया। धन्यवाद।
इंदरस्टेड

आप कह रहे हैं कि आप इनिशियलाइज़ करने जा रहे हैं categoriesPerPage, जो 2-डिम अरेंज है vजिसमें इंट है?
डैन

@Dan Your'e सही है, उदाहरण के सिर्फ प्रदर्शित करने के लिए किया जाता है setउदाहरण के लिए, की-बेशक आप असाइन नहीं कर सकते intमें[int]
डैनियल क्रोम

यह एक लाख बार किया और अभी भी अतिरिक्त = चिन्ह याद किया :)
अलेक्जेंड्रे जी

आपको सेमीकॉलन फैम की जरूरत नहीं है
पीटर शोर्न

51

इस पर ठोकर खाने वाले किसी और के लिए सुनिश्चित करें कि आप उदाहरण के बजाय कक्षा को संशोधित करने का प्रयास नहीं कर रहे हैं! (जब तक आपने वैरिएबल को स्थिर घोषित नहीं किया है)

जैसे।

MyClass.variable = 'Foo' // WRONG! - Instance member 'variable' cannot be used on type 'MyClass'

instanceOfMyClass.variable = 'Foo' // Right!

5
यह staticचर और instanceचर के बीच का अंतर है , MyClass.variableयदि आप इसे स्थिर चर (सभी उदाहरणों के बीच साझा) के रूप में घोषित करेंगे , तो मान्य है
डैनियल क्रॉम

यह मेरी समस्या थी। मुझे यह अजीब लगता है जब XCode ने वर्ग को पहले स्वत: पूर्ण विकल्पों में एक समान नाम वाले उदाहरण से पहले रखने का फैसला किया जब संदर्भ मुझे वर्ग के बजाय उदाहरण का उपयोग करने के लिए निश्चित रूप से इंगित करने के लिए लगता है। और ऐसे मामलों में जहां आपका उदाहरण केवल मामले से भिन्न होता है, यह नोटिस करना मुश्किल हो सकता है कि आपने उस वर्ग को चुना जो आपके द्वारा दिए गए उदाहरण के बजाय है। धन्यवाद!
लेफ्टऑनइम्यून

19

यह कह रहा है कि आपके पास एक उदाहरण चर है (जब आप केवल उस वर्ग का एक उदाहरण है तो चर दिखाई / पहुंच योग्य है) और आप इसे एक स्थैतिक क्षेत्र (वर्ग विधि) के संदर्भ में उपयोग करने का प्रयास कर रहे हैं।

आप अपने उदाहरण चर को स्थिर / वर्ग विशेषता जोड़कर एक वर्ग चर बना सकते हैं।

आप अपनी कक्षा के एक उदाहरण को इंस्टेंट करते हैं और उस चर पर उदाहरण विधि को कॉल करते हैं।


मेरे मामले में, मैंने एक दूसरे वर्ग के उदाहरण के बाद आरंभिक ब्लॉक में इंस्टेंस चर का उपयोग करने की कोशिश की थी। बेशक, एक init एक क्लास फ़ंक्शन है, और उदाहरण चर को स्थिर घोषित करने से समस्या हल हो गई।
रीनहार्ड मोनेर

8

एक और उदाहरण है, आपके पास वर्ग है जैसे:

@obc class Album: NSObject {
    let name:String
    let singer:Singer
    let artwork:URL
    let playingSong:Song


    // ...

    class func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
        // ...
       return playingSong.lyric
    }
}

आपको भी उसी प्रकार की त्रुटि मिलेगी जैसे:

instance member x cannot be used on type x. 

यह इसलिए है क्योंकि आप "वर्ग" कीवर्ड के साथ अपना तरीका असाइन करते हैं (जो आपके तरीके को एक प्रकार का तरीका बनाता है) और जैसे का उपयोग करना:

Album.getCurrentlyPlayingSongLyric(duration: 5)

लेकिन कौन पहले से खेलने के चर चर सेट? ठीक। आपको उस स्थिति के लिए क्लास कीवर्ड का उपयोग नहीं करना चाहिए:

 // ...

 func getCurrentlyPlayingSongLyric(duration: Int = 0) -> String {
        // ...
       return playingSong.lyric
 }

 // ...

अब तुम जाने के लिए स्वतंत्र हो।


7

कभी-कभी Xcode जब ओवरराइड के तरीके class funcसिर्फ के बजाय कहते हैं func। फिर स्थिर विधि में आप उदाहरण गुण नहीं देख सकते। इसे नजरअंदाज करना बहुत आसान है। यह मेरा मामला था।

यहां छवि विवरण दर्ज करें


आह आपका धन्यवाद! एक लंबा समय बिताया है कि मुझे Xcode में किसी भी सदस्य के स्वत: पूर्ण सुझाव क्यों नहीं मिल रहे हैं। यह एक बग की तरह लगता है, मैं एपल oor के साथ एक रडार दर्ज करूंगा v
अपूर्व खत्रेजा

3

आपकी प्रारंभिक समस्या थी:

class ReportView: NSView {
  var categoriesPerPage = [[Int]]()
  var numPages: Int = { return categoriesPerPage.count }
}

इंस्टेंस सदस्य 'श्रेणियांप्रेजेज' का उपयोग 'ReportView' प्रकार पर नहीं किया जा सकता है

पिछली पोस्टें सही ढंग से इंगित करती हैं, यदि आप एक गणना की गई संपत्ति चाहते हैं , तो =संकेत गलत है।

त्रुटि के लिए अतिरिक्त संभावना:

यदि आपका इरादा "किसी बंद या फ़ंक्शन के साथ डिफ़ॉल्ट संपत्ति मान सेट करना" था , तो आपको इसे केवल थोड़ा बदलने की आवश्यकता है। (नोट: यह उदाहरण स्पष्ट रूप से ऐसा करने का इरादा नहीं था)

class ReportView: NSView {
  var categoriesPerPage = [[Int]]()
  var numPages: Int = { return categoriesPerPage.count }()
}

हटाने के बजाय =, हम ()एक डिफ़ॉल्ट इनिशियलाइज़ेशन क्लोजर को निरूपित करने के लिए जोड़ते हैं । (यूआई कोड को इनिशियलाइज़ करते समय यह उपयोगी हो सकता है, यह सब एक जगह पर रखने के लिए।)

हालाँकि, ठीक वही त्रुटि होती है:

इंस्टेंस सदस्य 'श्रेणियांप्रेजेज' का उपयोग 'ReportView' प्रकार पर नहीं किया जा सकता है

समस्या एक संपत्ति को दूसरे के मूल्य के साथ शुरू करने की कोशिश कर रही है। एक उपाय है इनिशियलाइज़र बनाना lazy। यह तब तक निष्पादित नहीं किया जाएगा जब तक कि मूल्य तक पहुँचा नहीं जाता है।

class ReportView: NSView {
  var categoriesPerPage = [[Int]]()
  lazy var numPages: Int = { return categoriesPerPage.count }()
}

अब कंपाइलर खुश है!


0

मैं वैसा ही त्रुटि प्राप्त करता रहा जैसा कि परिवर्तनशील बनाने में है static। सॉल्यूशन: क्लीन बिल्ड, क्लीन डाइव्ड डेटा, रीस्टार्ट एक्सकोड। या शॉर्टकट Cmd + Shift + Alt + K

UserNotificationCenterWrapper.delegate = self

public static var delegate: UNUserNotificationCenterDelegate? {
        get {
            return UNUserNotificationCenter.current().delegate
        }
        set {
            UNUserNotificationCenter.current().delegate = newValue
        }
    }

0

अगर किसी को वास्तव में इस तरह से बंद करने की आवश्यकता होती है, तो यह निम्नलिखित तरीके से किया जा सकता है:

var categoriesPerPage = [[Int]]()
var numPagesClosure: ()->Int {
    return {
        return self.categoriesPerPage.count
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.