ইনস্ট্যান্স সদস্য টাইপ ব্যবহার করা যাবে না


138

আমার নিম্নলিখিত ক্লাস রয়েছে:

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

সংকলন বার্তাটি সহ ব্যর্থ:

'রিপোর্টভিউ' টাইপের ক্ষেত্রে ইনস্ট্যান্সের সদস্য 'বিভাগগুলির পেয়ারপেজ' ব্যবহার করা যাবে না

এটার মানে কি?


12
অনুমান করে আপনি numPagesসমান চিহ্নটি মুছে ফেলার পরিবর্তে গণিত সম্পত্তি ঘোষণা করতে যাচ্ছেন :var numPages: Int { return categoriesPerPage.count }
ভাদিয়ান

1
এই ত্রুটি বার্তার অর্থ কী, দয়া করে আরও বিশদভাবে ব্যাখ্যা করা যেতে পারে? আমি একেবারে অন্য প্রসঙ্গে দেখছি।
উইলিয়াম এন্টারিকেন

2
উপরের মতো আপনি যখন ক্লাস স্কোপে কোনও ব্লক ঘোষণা করেন তখন আপনি টাইপের মধ্যে যা সীমাবদ্ধ তা সীমাবদ্ধ। আপনার কোনও দৃষ্টান্তের সদস্যদের অ্যাক্সেস নেই।
অ্যাডারস্টেট

দ্রষ্টব্য: একটি অলস ভেরিয়েবল তৈরি করার চেষ্টা করার সময় ত্রুটি বার্তাটি আপনার অনুরূপ তবে প্রয়োজনীয়তার একটিটি ভুলে গিয়েছিল । আপনার ক্ষেত্রে আপনি অলস পরিবর্তনশীল চান না যেহেতু পরিবর্তে categoriesPerPageহিসাবে সংজ্ঞায়িত করা হয়েছে । varlet
সংবেদনশীল

1
সরান = থেকে: var numPages: অন্তর্ =
অ্যান্ড্রুজ

উত্তর:


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
উফ, আমি সমান চিহ্নটি মিস করেছি missed ধন্যবাদ।
অ্যাডারস্টেট

আপনি বলছেন যে আপনি আরম্ভ করতে যাচ্ছেন categoriesPerPage, এটি কোন ধরণের 2 মিম্বল অ্যারে v?
ড্যান

@Dan Your'e ঠিক আছে, উদাহরণস্বরূপ শুধু প্রকট হয় setযেমন, অফ অবশ্যই আপনি ধার্য করতে পারেন না intবা[int]
ড্যানিয়েল Krom

এটি একটি মিলিয়ন বার হয়ে গেছে এবং এখনও অতিরিক্ত = চিহ্নটি মিস করেছে :)
আলেকজান্দ্রে জি

আপনার সেমিকোলন ফ্যামের দরকার নেই
পিটার শোর্ন

51

অন্য যে কেউ এতে হোঁচট খায় তা নিশ্চিত করুন যে আপনি উদাহরণের চেয়ে ক্লাসটি সংশোধন করার চেষ্টা করছেন না! (যদি না আপনি ভেরিয়েবলটিকে স্থির হিসাবে ঘোষণা করেন)

যেমন।

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

instanceOfMyClass.variable = 'Foo' // Right!

5
এটি staticভেরিয়েবল এবং instanceভেরিয়েবলের মধ্যে পার্থক্য , MyClass.variableবৈধ হয় যদি আপনি এটি স্থির পরিবর্তনশীল হিসাবে ঘোষণা করেন (সমস্ত উদাহরণের মধ্যে ভাগ করা হয়েছে)
ড্যানিয়েল ক্রোম

এটা আমার সমস্যা ছিল। আমি এক ধরণের অদ্ভুত দেখতে পেলাম যখন এক্সকোড একই ধরণের নামকরণের আগে স্বতঃসম্পূর্ণ বিকল্পগুলিতে শ্রেণিটিকে প্রথম স্থানে রাখার সিদ্ধান্ত নেয় যখন প্রসঙ্গটি ক্লাসের চেয়ে বরং উদাহরণটি ব্যবহার করে অবশ্যই আমার দিকে ইঙ্গিত করে বলে মনে হয়। এবং ক্ষেত্রে যেখানে আপনার উদাহরণটি কেবল কেস অনুসারে পৃথক হয়, আপনি ক্লাসটি বেছে নিয়েছেন তার চেয়ে বরং আপনি ক্লাসটি বেছে নিয়েছেন তা লক্ষ্য করা শক্ত be ধন্যবাদ!
বাম -আনমুন

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

কখনও কখনও এক্সকোড যখন ওভাররাইডগুলি পদ্ধতি class funcকেবল পরিবর্তে যুক্ত হয় func। তারপরে স্থিতিশীল পদ্ধতিতে আপনি উদাহরণের বৈশিষ্ট্য দেখতে পাবেন না। এটি উপেক্ষা করা খুব সহজ। এটা আমার কেস ছিল।

এখানে চিত্র বর্ণনা লিখুন


আহ আপনাকে ধন্যবাদ! এক্সকোডে আমি কোনও সদস্য পদটির স্বতঃপূরণ পরামর্শ কেন পাচ্ছি না তা ভেবে দীর্ঘ সময় ব্যয় করুন। এটি একটি বাগের মতো মনে হচ্ছে, আমি অ্যাপলের সাথে একটি রাডার ফাইল করব
অপুরভ খাতরেজা

3

আপনার প্রাথমিক সমস্যাটি ছিল:

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

'রিপোর্টভিউ' টাইপের ক্ষেত্রে ইনস্ট্যান্সের সদস্য 'বিভাগগুলির পেয়ারপেজ' ব্যবহার করা যাবে না

পূর্ববর্তী পোস্টগুলি সঠিকভাবে নির্দেশ করে, আপনি যদি কোনও গণনা করা সম্পত্তি চান , =সাইনটি ভ্রান্ত হয়।

ত্রুটির অতিরিক্ত সম্ভাবনা:

যদি আপনার অভিপ্রায়টি "একটি বন্ধ বা ফাংশন সহ একটি ডিফল্ট সম্পত্তি মান নির্ধারণ করা " ছিল , আপনার কেবল এটির সামান্য পরিবর্তনও করা উচিত। (দ্রষ্টব্য: এই উদাহরণটি অবশ্যই এটি করার উদ্দেশ্যে করা হয়নি)

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

পরিবর্তে এর অপসারণ =, আমরা যোগ করুন() একটি ডিফল্ট সূচনা ক্লোজার বোঝাতে । (এটি সমস্ত জায়গায় এক জায়গায় রাখার জন্য, ইউআই কোড শুরু করার সময় এটি কার্যকর হতে পারে))

তবে ঠিক একই ত্রুটি ঘটে:

'রিপোর্টভিউ' টাইপের ক্ষেত্রে ইনস্ট্যান্সের সদস্য 'বিভাগগুলির পেয়ারপেজ' ব্যবহার করা যাবে না

সমস্যাটি অন্যের মান দিয়ে একটি সম্পত্তি আরম্ভ করার চেষ্টা করছে। একটি সমাধান ইনিশিয়ালাইজার তৈরি করা lazy। মান অ্যাক্সেস না করা পর্যন্ত এটি কার্যকর করা হবে না।

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

সংকলক এখন খুশি!


0

ভেরিয়েবলটি তৈরি করার পরেও আমি একই ত্রুটি পেয়েছি static। সমাধান: ক্লিন বিল্ড, ক্লিন ডেরিভড ডেটা, পুনরায় আরম্ভ করুন এক্সকোড। অথবা শর্টকাট সিএমডি + শিফট + আল্ট + কে

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
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.