সুইফ্ট শ্রেণিতে ত্রুটি: সম্পত্তি সুপার ইনিট কলটিতে আরম্ভ করা হয়নি


218

আমার দুটি ক্লাস আছে, ShapeএবংSquare

class Shape {
    var numberOfSides = 0
    var name: String
    init(name:String) {
        self.name = name
    }
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

class Square: Shape {
    var sideLength: Double

    init(sideLength:Double, name:String) {
        super.init(name:name) // Error here
        self.sideLength = sideLength
        numberOfSides = 4
    }
    func area () -> Double {
        return sideLength * sideLength
    }
}

উপরের প্রয়োগের সাথে সাথে আমি ত্রুটিটি পেয়েছি:

property 'self.sideLength' not initialized at super.init call
    super.init(name:name)

self.sideLengthফোন করার আগে আমাকে কেন সেট করতে হবে super.init?


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

3
বইয়ের উদাহরণগুলি খারাপ। নীচে ব্যাখ্যা করা হয়েছে যে সমস্ত সম্পত্তি শুরু করা হয়েছে তা নিশ্চিত হওয়ার জন্য আপনাকে সর্বদা সুপার.ইনাইট () সর্বদা কল করতে হবে।
পাস্কাল

উত্তর:


173

দ্য সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে উদ্ধৃতি, যা আপনার প্রশ্নের উত্তর দেয়:

"সুইফটের সংকলকটি ত্রুটি ছাড়াই দ্বি-পর্বের সূচনা সম্পন্ন হয়েছে তা নিশ্চিত করতে চারটি সহায়ক সুরক্ষা-চেকগুলি সম্পাদন করে:"

সুরক্ষা চেক 1 "একটি মনোনীত ইনিশিয়ালাইজারকে অবশ্যই নিশ্চিত করতে হবে যে" শ্রেণীর দ্বারা প্রবর্তিত সমস্ত বৈশিষ্ট্য একটি সুপারক্লাস ইনিশিয়ালাইজারের কাছে অর্পণ করার আগেই এটি শুরু করা হয়েছে। "

এর উত্স: অ্যাপল ইনক। "দ্য সুইফ্ট প্রোগ্রামিং ভাষা।" iBooks। https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11


47
সি ++, সি # বা জাভার তুলনায় এখন এটি একটি বিস্ময়কর পরিবর্তন।
এমডিজে

12
@ এমডিজে নিশ্চিত বিষয়। আমি সত্যই এটির যুক্ত হওয়া মূল্য দেখতে পাচ্ছি না।
রুবেন

20
আসলে এক আছে বলে মনে হচ্ছে। সি # তে বলুন, সুপার ক্লাস কনস্ট্রাক্টরকে কোনও ওভারডেবল (ভার্চুয়াল) পদ্ধতি কল করা উচিত নয়, কারণ তারা জানেন না যে তারা কীভাবে পুরোপুরি আরম্ভ করা সাবক্লাসের সাথে প্রতিক্রিয়া জানাবে না। সুইফ্টে ঠিক আছে, সাবক্লাস-অতিরিক্ত অবস্থা যেমন ঠিক আছে, যখন সুপারক্লাস নির্মাণকারী চলছে। তদ্ব্যতীত, সুইফটে চূড়ান্ত পদ্ধতিগুলি বাদে সবগুলিই ওভারড্রাইয়েবল।
এমডিজে

17
আমি বিশেষত এটি বিরক্তিকর হিসাবে খুঁজে পাচ্ছি কারণ এর অর্থ, যদি আমি কোনও ইউআইভিউ সাবক্লাস তৈরি করতে চাই যা এর নিজস্ব উপদর্শনগুলি তৈরি করে, আমি ফ্রেম ছাড়াই এই সাবভিউগুলি শুরু করতে এবং পরে ফ্রেমগুলি যুক্ত করতে চাই কারণ আমি দৃশ্যের সাথে উল্লেখ করতে পারি না সুপার.ইনটি কল করার পরে সীমাবদ্ধ।
অ্যাশ

5
@ জ্যানোস যদি আপনি সম্পত্তিটি alচ্ছিক করেন তবে আপনাকে এটি আরম্ভ করতে হবে না init
জেরেমিপ

105

সুইফেটের অপারেশনের একটি খুব স্পষ্ট, নির্দিষ্ট ক্রম রয়েছে যা প্রারম্ভকালে করা হয়। আসুন কয়েকটি বুনিয়াদি উদাহরণ দিয়ে শুরু করি এবং একটি সাধারণ কেস পর্যন্ত কাজ করি।

আসুন একটি অবজেক্ট এ নেওয়া যাক আমরা নীচে এটি সংজ্ঞায়িত করব।

class A {
    var x: Int
    init(x: Int) {
        self.x = x
    }
}

লক্ষ্য করুন যে এ এর ​​একটি সুপারক্লাস নেই, সুতরাং এটি সুপারিনাইট () ফাংশনটি কল করতে পারে না কারণ এটি বিদ্যমান নেই।

ঠিক আছে, এখন আসুন বি নামে একটি নতুন শ্রেণি সহ এ সাবক্লাস করুন

class B: A {
    var y: Int
    init(x: Int, y: Int) {
        self.y = y
        super.init(x: x)
    }
}

এটি উদ্দেশ্য-সি থেকে প্রস্থান যেখানে [super init]সাধারণত অন্য কোনও কিছুর আগে প্রথমে ডাকা হত। সুইফটে তাই নয় Not আপনি অন্য কিছু করার আগে কল করার পদ্ধতিগুলি (যার মধ্যে আপনার সুপারক্লাসের প্রাথমিককরণ অন্তর্ভুক্ত রয়েছে) সহ আপনার উদাহরণের ভেরিয়েবলগুলি সামঞ্জস্যপূর্ণ অবস্থায় রয়েছে তা নিশ্চিত করার জন্য আপনি দায়বদ্ধ।


1
এটি অত্যন্ত সহায়ক, একটি স্পষ্ট উদাহরণ। ধন্যবাদ!
ফুলমেটালফিস্ট

আমার যদি y এর গণনা করার জন্য মানটির প্রয়োজন হয় তবে উদাহরণস্বরূপ: init (y: Int) {self.y = y * self.x super.init ()}
6rod9

1
এর মতো কিছু ব্যবহার করুন, init (y: Int, x: int = 0) {self.y = y * x; self.x = x; সুপার.init (x: x)}, এছাড়াও আপনি উপরের উদাহরণের সাথে সরাসরি সুপার ক্লাসের জন্য খালি কনস্ট্রাক্টরকে কল করতে পারবেন না, কারণ সুপার ক্লাসের নাম এ-তে খালি কনস্ট্রাক্টর নেই
হিতেন্দ্র সোলঙ্কি

43

ডক্স থেকে

সুরক্ষা চেক 1

একজন মনোনীত ইনিশিয়ালাইজারকে অবশ্যই নিশ্চিত করতে হবে যে এটির শ্রেণীর দ্বারা প্রবর্তিত সমস্ত সম্পত্তি একটি সুপারক্লাস ইনিশিয়ালাইজারের কাছে অর্পণ করার আগেই এটির সূচনা হয়েছিল।


আমাদের কেন এই জাতীয় সুরক্ষা চেক দরকার?

এর উত্তর দিতে দ্রুত চলতে শুরু করা যাক initial

দ্বি-পর্বের সূচনা

সুইফটে ক্লাস ইনিশিয়ালাইজেশন একটি দ্বি-ফেজ প্রক্রিয়া। প্রথম পর্যায়ে, প্রতিটি সঞ্চিত সম্পত্তি শ্রেণি দ্বারা এটির সূচনা করে একটি প্রাথমিক মান নির্ধারিত হয়। একবার প্রতিটি সঞ্চিত সম্পত্তির প্রাথমিক অবস্থা নির্ধারণ করা হলে, দ্বিতীয় পর্ব শুরু হয় এবং নতুন শ্রেণীর ব্যবহারের জন্য প্রস্তুত হিসাবে বিবেচনা করার আগে প্রতিটি শ্রেণিকে তার সঞ্চিত বৈশিষ্ট্যগুলি আরও কাস্টমাইজ করার সুযোগ দেওয়া হয়।

দ্বি-পর্বের সূচনা প্রক্রিয়াটির ব্যবহার সূচনাটি নিরাপদ করে তোলে, তবুও প্রতিটি শ্রেণীর শ্রেণিবিন্যাসে প্রতিটি শ্রেণিকে সম্পূর্ণ নমনীয়তা দেয়। দ্বি-পর্যায়ে সূচনা সম্পত্তি মানগুলি আরম্ভ করার আগে অ্যাক্সেস করা থেকে বাধা দেয় এবং সম্পত্তি মানগুলি অপ্রত্যাশিতভাবে অন্য আরম্ভকারী দ্বারা পৃথক মান সেট করা থেকে বাধা দেয়।

সুতরাং, উপরোক্ত সংজ্ঞায়িত হিসাবে দুটি পদক্ষেপের সূচনা প্রক্রিয়াটি সম্পন্ন হয়েছে তা নিশ্চিত করার জন্য, এখানে চারটি সুরক্ষা চেক রয়েছে, যার মধ্যে একটি হ'ল,

সুরক্ষা চেক 1

একজন মনোনীত ইনিশিয়ালাইজারকে অবশ্যই নিশ্চিত করতে হবে যে এটির শ্রেণীর দ্বারা প্রবর্তিত সমস্ত সম্পত্তি একটি সুপারক্লাস ইনিশিয়ালাইজারের কাছে অর্পণ করার আগেই এটির সূচনা হয়েছিল।

এখন, দুই ধাপের সূচনাটি কখনই আদেশের বিষয়ে কথা বলে না, তবে এই সুরক্ষা চেকটি super.initসমস্ত সম্পত্তি শুরু করার পরে অর্ডার দেওয়ার জন্য পরিচয় করিয়ে দেয়।

সুরক্ষা চেক 1 এটিকে অপ্রাসঙ্গিক বলে মনে হতে পারে, দ্বি-পর্বের সূচনা সম্পত্তি মানগুলি আরম্ভ করার আগেই তা অ্যাক্সেস হওয়া থেকে বাধা দেয় এই সুরক্ষা চেক 1 ছাড়াই সন্তুষ্ট হতে পারে।

এই নমুনা মত

class Shape {
    var name: String
    var sides : Int
    init(sides:Int, named: String) {
        self.sides = sides
        self.name = named
    }
}

class Triangle: Shape {
    var hypotenuse: Int
    init(hypotenuse:Int) {
        super.init(sides: 3, named: "Triangle") 
        self.hypotenuse = hypotenuse
    }
}

Triangle.initব্যবহার শুরু করার আগে প্রতিটি সম্পত্তি শুরু করে দিয়েছে। সুতরাং সুরক্ষা চেক 1 অপ্রাসঙ্গিক বলে মনে হচ্ছে,

তবে তারপরে আর এক দৃশ্য হতে পারে, কিছুটা জটিল,

class Shape {
    var name: String
    var sides : Int
    init(sides:Int, named: String) {
        self.sides = sides
        self.name = named
        printShapeDescription()
    }
    func printShapeDescription() {
        print("Shape Name :\(self.name)")
        print("Sides :\(self.sides)")
    }
}

class Triangle: Shape {
    var hypotenuse: Int
    init(hypotenuse:Int) {
        self.hypotenuse = hypotenuse
        super.init(sides: 3, named: "Triangle")
    }

    override func printShapeDescription() {
        super.printShapeDescription()
        print("Hypotenuse :\(self.hypotenuse)")
    }
}

let triangle = Triangle(hypotenuse: 12)

আউটপুট:

Shape Name :Triangle
Sides :3
Hypotenuse :12

এখানে আমরা যদি super.initসেটিংস স্থাপনের আগে কল করেছিলাম hypotenuse, super.initকলটি তখন কল করত printShapeDescription()এবং যেহেতু ওভাররাইড করা হয়েছে তা এটি প্রথমে ট্রায়াঙ্গলের শ্রেণি প্রয়োগের ফ্যালব্যাক হয়ে যাবে printShapeDescription()printShapeDescription()ট্রায়াঙ্গেল বর্গ অ্যাক্সেস hypotenuseএকটি অ ঐচ্ছিক সম্পত্তি এখনও ইনিশিয়ালাইজ করা হয় নি যে। এবং এটি অনুমোদিত নয় কারণ দ্বি-ফেজ সূচনা সম্পত্তি সম্পত্তিগুলি আরম্ভ করার আগে তাদের অ্যাক্সেস করা থেকে বাধা দেয়

সুতরাং নিশ্চিত করুন যে দ্বি ফেজের সূচনাটি সংজ্ঞায়িত হিসাবে সম্পন্ন হয়েছে, সেখানে কল করার একটি নির্দিষ্ট ক্রম হওয়া দরকার super.init, এবং তা হচ্ছে selfশ্রেণীর দ্বারা প্রবর্তিত সমস্ত সম্পত্তি শুরু করার পরে , আমাদের সুরক্ষা চেক 1 দরকার


1
দুর্দান্ত ব্যাখ্যা, কেন শীর্ষে উত্তরে অবশ্যই স্পষ্টভাবে যুক্ত করা উচিত।
গাই দাহের

সুতরাং আপনি মূলত বলছেন, কারণ সুপারক্লাসগুলি একটি (ওভারডিডেন) ফাংশন কল init করতে পারে ... যাতে সেই ফাংশনটি সাবক্লাসের সম্পত্তিতে অ্যাক্সেস করে, তারপরে মানগুলি সেট না করে এড়ানোর জন্য, superসমস্ত মান সেট হওয়ার পরে কলটি অবশ্যই ঘটবে। ঠিক আছে মানে। অবাক হোন কীভাবে উদ্দেশ্যমূলক-সি এটি করেছিল এবং কেন আপনাকে superপ্রথমে কল করতে হয়েছিল ?
মধু

মূলত কি হয়েছে তোমার ইশারা করছি অনুরূপ স্থাপন: থেকে printShapeDescription() সামনে self.sides = sides; self.name = named; যা এই ত্রুটি উৎপন্ন হবে: use of 'self' in method call 'printShapeDescription' before all stored properties are initialized। ওপেনটির ত্রুটিটি রানটাইম ত্রুটির 'সম্ভাবনা' হ্রাস করতে দেওয়া হয়।
মধু

আমি বিশেষত 'সম্ভাবনা' শব্দটি ব্যবহার করেছি, কারণ যদি printShapeDescriptionএমন কোনও ফাংশন ছিল যা বোঝায় না selfযেমন এটি মুদ্রণের মতো কিছু ছিল ("কিছুই না") তবে কোনও সমস্যা হত না। (তবুও এর জন্যও সংকলকটি একটি ত্রুটি ফেলবে, কারণ এটি দুর্দান্ত স্মার্ট নয়)
হানি ২

ওয়েল অবজেক ঠিক নিরাপদ ছিল না। সুইফটটি প্রকারের সুরক্ষিত যাতে অবজেক্টগুলি thatচ্ছিক নয় যা সত্যই ননিল হওয়া দরকার!
দাইজ-দাজন

36

আপনি আপনার সমস্ত দৃষ্টান্তের ভেরিয়েবল শুরু করার পরে "সুপার ইন্ডিটাইট ()" কল করা উচিত।

অ্যাপলের "ইন্টারমিডিয়েট সুইফ্ট" ভিডিওতে (আপনি এটি অ্যাপল বিকাশকারী ভিডিও সংস্থান পৃষ্ঠা https://developer.apple.com/videos/wwdc/2014/ এ খুঁজে পেতে পারেন ), স্পষ্টভাবে বলা হয়েছে যে সমস্ত প্রারম্ভিক আপনার ক্লাসটি ভেরিয়েবল শুরু করার পরে সুপার ক্লাসটি অবশ্যই বলা হবে।

উদ্দেশ্য-সি-তে, এটি ছিল বিপরীত। সুইফটে, যেহেতু সমস্ত বৈশিষ্ট্য ব্যবহারের আগে এটি আরম্ভ করা দরকার, তাই আমাদের প্রথমে বৈশিষ্ট্যগুলি আরম্ভ করার প্রয়োজন। এটি সুপার শ্রেণীর "init ()" পদ্ধতি থেকে প্রথমে বৈশিষ্ট্যগুলি আরম্ভ না করেই ওভাররাইড ফাংশনটিতে কল রোধ করা।

সুতরাং "স্কয়ার" বাস্তবায়ন হওয়া উচিত:

class Square: Shape {
    var sideLength: Double

    init(sideLength:Double, name:String) {
        self.sideLength = sideLength
        numberOfSides = 4
        super.init(name:name) // Correct position for "super.init()"
    }
    func area () -> Double {
        return sideLength * sideLength
    }
}

1
কখনও অনুমান করা হবে না। সুপারের সাথে সূচনাটি মুষ্টির বক্তব্য হওয়া উচিত যা আমি ভাবতাম। !! HM। দ্রুত সঙ্গে পরিবর্তন।
পৌরাণিক

কেন এই পরে আসা প্রয়োজন? দয়া করে একটি প্রযুক্তিগত কারণ সরবরাহ করুন
মসিহ

14

কুরুচিপূর্ণ বিন্যাসের জন্য দুঃখিত। ঘোষণার পরে কেবল একটি প্রশ্নের চরিত্র রাখুন এবং সবকিছু ঠিক থাকবে। একটি প্রশ্ন সংকলককে বলে যে মানটি .চ্ছিক।

class Square: Shape {
    var sideLength: Double?   // <=== like this ..

    init(sideLength:Double, name:String) {
        super.init(name:name) // Error here
        self.sideLength = sideLength
        numberOfSides = 4
    }
    func area () -> Double {
        return sideLength * sideLength
    }
}

Edit1:

এই ত্রুটিটি এড়িয়ে যাওয়ার আরও ভাল উপায় আছে। জামাসচাদের মন্তব্য অনুসারে আপনার ক্ষেত্রে alচ্ছিক ব্যবহার করার কোনও কারণ নেই কারণ বিকল্পগুলি ব্যবহারে স্বাচ্ছন্দ্য বোধ করে না এবং এটির অ্যাক্সেসের আগে আপনাকে সর্বদা পরীক্ষা করে দেখতে হবে optionচ্ছিক এটি নিষ্ক্রিয় নয়। সুতরাং আপনাকে যা করতে হবে তা হ'ল ঘোষণার পরে সদস্যকে আরম্ভ করা:

class Square: Shape {
    var sideLength: Double=Double()   

    init(sideLength:Double, name:String) {
        super.init(name:name)
        self.sideLength = sideLength
        numberOfSides = 4
    }
    func area () -> Double {
        return sideLength * sideLength
    }
}

Edit2:

এই উত্তরটি দুটি মিনিট পাওয়ার পরে আমি আরও ভাল উপায় খুঁজে পেয়েছি। আপনি যদি চান আপনার কন্সট্রাক্টরে ক্লাস মেম্বারকে আরম্ভ করতে হবে তবে আপনাকে অবশ্যই এটির জন্য প্রাথমিক মান নির্বাহকের ভিতরে এবং সুপার ইন্ডিয়াট () কল করার আগে নির্ধারণ করতে হবে। এটার মত:

class Square: Shape {
    var sideLength: Double  

    init(sideLength:Double, name:String) {
        self.sideLength = sideLength   // <= before super.init call..
        super.init(name:name)
        numberOfSides = 4
    }
    func area () -> Double {
        return sideLength * sideLength
    }
}

সুইফট শেখার জন্য শুভকামনা।


শুধু স্যুইচ super.init(name:name)এবং self.sideLength = sideLength। Alচ্ছিক sideLengthহিসাবে ঘোষনা করা বিপথগামী এবং পরে যখন আপনাকে এটিকে জড়ো করতে বাধ্য করতে হয় তখন অতিরিক্ত ঝামেলা শুরু করে।
জোহানেস লুং

হ্যাঁ, এটি একটি বিকল্প। ধন্যবাদ
fnc12

আপনার আসলে ঠিক আছে var sideLength: Double, এটির প্রাথমিক মূল্য নির্ধারণের দরকার নেই
জার্সেন

আমার যদি সত্যিই একটি alচ্ছিক ধ্রুবক থাকে What আমি এটি দিয়ে কি করব? আমাকে কি কনস্ট্রাক্টরতে আরম্ভ করতে হবে? আপনাকে এটি করতে হবে তা আমি দেখতে পাচ্ছি না, তবে সংকলকটি সুইফট ১.২
ভান ডু ট্রান

1
পারফেক্ট! সমস্ত 3 সমাধান "?", "স্ট্রিং ()" তে কাজ করেছিল, তবে আমার কাছে সমস্যাটি ছিল আমি সম্পত্তিটির একটিও 'অর্পণ' করি নি, এবং আমি যখন এটি কাজ করেছি!
সাথীদের

9

এটি কখনও / ব্যবহৃত হতে পারে তার আগে প্রতিটি সদস্যের ভেরিফিট আপনাকে আরম্ভ করার জন্য কার্যকর করে। যেহেতু এটি সুপারিশে পরিণত হওয়ার পরে কী ঘটে তা নিশ্চিত হতে পারে না তাই এটি ত্রুটিযুক্ত: দুঃখিতের চেয়ে ভাল নিরাপদ


1
আইএমও এর কোনও অর্থ হয় না কারণ পিতামাত্ত শ্রেণীর শিশুদের মধ্যে ঘোষিত বৈশিষ্ট্যের কোনও দৃশ্যমানতা থাকা উচিত নয়!
অ্যান্ডি হিন

1
এটি এমন নয় যে আপনি স্টাফকে ওভাররাইড করে
নিজেরাই

আপনি কি এখানে এবং মন্তব্যগুলি দেখতে পাচ্ছেন ? আমি মনে করি আমি যা বলছি ঠিক তাই বলছি অর্থাৎ আমরা দুজনেই বলছি সংকলক দুঃখিত হওয়ার চেয়ে নিরাপদ থাকতে চায়, আমার একটাই প্রশ্ন, তবে উদ্দেশ্য-সি এই সমস্যাটি কীভাবে সমাধান করেছিল? নাকি তা হয়নি? যদি তা না হয় তবে কেন এখনও super.initআপনার প্রথম লাইনে লেখার দরকার নেই ?
মধু

7

এডওয়ার্ড

আপনি আপনার উদাহরণে কোডটি এইরকম পরিবর্তন করতে পারেন:

var playerShip:PlayerShip!
var deltaPoint = CGPointZero

init(size: CGSize)
{
    super.init(size: size)
    playerLayerNode.addChild(playerShip)        
}

এটি সুস্পষ্টভাবে মোড়কযুক্ত usingচ্ছিক ব্যবহার করছে is

ডকুমেন্টেশনে আমরা পড়তে পারি:

"বিকল্পগুলির মতো, আপনি যখন একটি স্পষ্টতভাবে মোড়কযুক্ত raচ্ছিক ভেরিয়েবল বা সম্পত্তি ঘোষণা করেন আপনি যদি প্রাথমিক মানটি সরবরাহ করেন না, তবে এটির মান স্বয়ংক্রিয়ভাবে শূন্য হয়ে যায় def"


আমি মনে করি এটিই সবচেয়ে পরিষ্কার বিকল্প। আমার প্রথম সুইফ্ট প্রয়াসে আমার কাছে অ্যাভিসি ক্যাপচারডেভাইস টাইপের একটি সদস্য ভেরিয়েবল ছিল, যা সরাসরি ইনস্ট্যান্ট করা যায় না, সুতরাং থ্রি () কোডের প্রয়োজন ছিল। যাইহোক, ভিউকন্ট্রোলারের একাধিক সূচনা প্রয়োজন, এবং আপনি init () থেকে একটি সাধারণ সূচনা পদ্ধতি কল করতে পারবেন না, সুতরাং এই উত্তরটি একমাত্র বিকল্প বলে মনে হচ্ছে যা প্রতিটি আরম্ভকারীর মধ্যে অনুলিপি কোড অনুলিপি / আটকানো এড়ায়।
সনেটোস

6

ওবিজে সি এর বিপরীতে বৈশিষ্ট্যগুলি আরম্ভ করার সাথে সাথে সুইফ্ট আপনাকে সুপার ক্লাস শুরু করার অনুমতি দেবে না সুতরাং আপনাকে "সুপার ইন্ডিআইটি" কল করার আগে সমস্ত বৈশিষ্ট্য আরম্ভ করতে হবে।

দয়া করে http://blog.scottlogic.com/2014/11/20/swift-initialisation.html এ যান । এটি আপনার সমস্যার সুন্দর ব্যাখ্যা দেয়।


6

ঘোষণার শেষে শূন্য করুন।


// Must be nil or swift complains
var someProtocol:SomeProtocol? = nil

// Init the view
override init(frame: CGRect)
    super.init(frame: frame)
    ...

এটি আমার ক্ষেত্রে কাজ করেছে, তবে এটি আপনার পক্ষে কাজ নাও করতে পারে


ভাল, প্রোটোকল সহ
ইউআইভিউ কনট্রোলারের

1

আপনি কেবল ভুল ক্রমে সন্ধান করছেন।

     class Shape2 {
        var numberOfSides = 0
        var name: String
        init(name:String) {
            self.name = name
        }
        func simpleDescription() -> String {
            return "A shape with \(numberOfSides) sides."
        }
    }

    class Square2: Shape2 {
        var sideLength: Double

        init(sideLength:Double, name:String) {

            self.sideLength = sideLength
            super.init(name:name) // It should be behind "self.sideLength = sideLength"
            numberOfSides = 4
        }
        func area () -> Double {
            return sideLength * sideLength
        }
    }

0

আমি সম্ভবত কিছু ডাউনভোট পাব, তবে সত্যি বলতে কী, জীবন এভাবে সহজ হয়:

class CSListServerData<ListItem: CSJsonData>: CSServerData {
    var key: String!
    var type: ListItem.Type!
    var property: CSJsonDataList<ListItem>!

    func construct(_ key: String, _ type: ListItem.Type) -> Self {
        self.key = key
        self.type = type
        property = CSJsonDataList(self, type, key)
        return self
    }

    func construct(_ type: ListItem.Type) { construct("list", type) }

    var list: [ListItem] { property.list }
}

-4

এটি একটি বিস্ময়কর বোকা নকশা।

এর মতো কিছু বিবেচনা করুন:

.
.
.
var playerShip:PlayerShip
var deltaPoint = CGPointZero

init(size: CGSize)
{
    super.init(size: size)
    playerShip = PlayerShip(pos: CGPointMake(self.size.width / 2.0, 100))
    playerLayerNode.addChild(playerShip)        
}
.
.
.

এটি অবৈধ, উপরে উল্লিখিত হিসাবে। তবে তাই:

.
.
.
var playerShip:PlayerShip = PlayerShip(pos: CGPointMake(self.size.width / 2.0, 100))
var deltaPoint = CGPointZero

init(size: CGSize)
{
    super.init(size: size)
    playerLayerNode.addChild(playerShip)        
}
.
.
.

কারণ 'স্ব' আরম্ভ করা হয়নি।

আমি আন্তরিকভাবে আশা করি শীঘ্রই এই বাগটি ঠিক হয়ে গেছে।

(হ্যাঁ আমি জানি আমি একটি খালি বস্তু তৈরি করতে এবং তারপরে আকার নির্ধারণ করতে পারি তবে এটি কেবল নির্বোধ)।


2
এটি বাগ নয়, এটি ওওপিগুলির নতুন প্রোগ্রামিং মৌলিক।
হিতেন্দ্র সোলঙ্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.