ক্লাস 'ভিউকন্ট্রোলার' এর দ্রুতগতিতে কোনও আরম্ভকারী নেই


123

আমি যখন এটি করছি তখন সংকলকটির কাছ থেকে অভিযোগ পাওয়া

class ViewController: UIViewController {

    var delegate : AppDelegate
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //self.appDelegate = UIApplication.sharedApplication().delegate;

    }

    @IBAction func getData(sender : AnyObject) {

    }

    @IBAction func LogOut(sender : AnyObject) {
    }
}

তবে, আমি কি শুধু যুক্ত করব ? AppDelegate শেষে নীচের মত এবং ত্রুটি চলে গেছে।

class ViewController: UIViewController {

    var delegate : AppDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //self.appDelegate = UIApplication.sharedApplication().delegate;

    }

    @IBAction func getData(sender : AnyObject) {

    }

    @IBAction func LogOut(sender : AnyObject) {
    }
}

আমি optionalভুল না হলে আমি এই ত্রুটির সাথে প্রাসঙ্গিক কীওয়ার্ডটি দেখতে পাচ্ছি না ।

উত্তর:


239

ত্রুটিটি উন্নত করা যেতে পারে, তবে আপনার প্রথম সংস্করণে সমস্যাটি হ'ল আপনার সদস্য ভেরিয়েবল রয়েছে, delegateএটির কোনও ডিফল্ট মান নেই। সুইফ্টের সমস্ত ভেরিয়েবলের সর্বদা একটি মান থাকতে হবে। এর অর্থ হ'ল আপনাকে এটিকে একটি ইনিশিয়ালাইজারে সেট আপ করতে হবে যা আপনার নেই বা আপনি এটি লাইনটিকে একটি লাইন-ইন-লাইন সরবরাহ করতে পারেন।

আপনি যখন এটি alচ্ছিক করে তোলেন, আপনি nilস্পষ্টভাবে এটির কোনও মূল্য দিতে বা এটি আরম্ভ করার প্রয়োজনটিকে সরিয়ে আপনি এটি ডিফল্টরূপে হতে দেন।


45

সুইফ্ট প্রোগ্রামিং ভাষাতে বলা হয়েছে:

শ্রেণি এবং কাঠামোগুলি class শ্রেণীর বা কাঠামোর উদাহরণ তৈরি করার সময় অবশ্যই তাদের সমস্ত সঞ্চিত বৈশিষ্ট্যকে একটি উপযুক্ত প্রাথমিক মানতে সেট করতে হবে। সঞ্চিত বৈশিষ্ট্যগুলি অনির্দিষ্ট অবস্থায় ছেড়ে দেওয়া যায় না।

আপনি প্রাথমিক স্তরের মধ্যে কোনও সঞ্চিত সম্পত্তির জন্য, বা সম্পত্তিটির সংজ্ঞা হিসাবে অংশ হিসাবে একটি ডিফল্ট সম্পত্তি মান নির্ধারণ করে একটি প্রাথমিক মান সেট করতে পারেন।

অতএব, আপনি লিখতে পারেন:

class myClass {

    var delegate: AppDelegate //non-optional variable

    init() {
        delegate = UIApplication.sharedApplication().delegate as AppDelegate
    }

}

বা:

class myClass {

    var delegate = UIApplication.sharedApplication().delegate as AppDelegate //non-optional variable

    init() {
        println("Hello")
    }

}

বা:

class myClass {

    var delegate : AppDelegate! //implicitly unwrapped optional variable set to nil when class is initialized

    init() {
        println("Hello")
    }

    func myMethod() {
        delegate = UIApplication.sharedApplication().delegate as AppDelegate
    }

}

তবে আপনি নিম্নলিখিত লিখতে পারবেন না:

class myClass {

    var delegate : AppDelegate //non-optional variable

    init() {
        println("Hello")
    }

    func myMethod() {
        //too late to assign delegate as an non-optional variable
        delegate = UIApplication.sharedApplication().delegate as AppDelegate
    }

}

22

কখনও কখনও এই ত্রুটিটি তখনও উপস্থিত হয় যখন আপনার কাছে কোনও ভের বা লট থাকে যা অন্তর্নিহিত হয়নি।

উদাহরণ স্বরূপ

class ViewController: UIViewController {
    var x: Double
    // or
    var y: String
    // or
    let z: Int
}

আপনার ভেরিয়েবলটি যা করতে হবে তার উপর নির্ভর করে আপনি সেই ভেরি টাইপটিকে alচ্ছিক হিসাবে সেট করতে পারেন বা নীচের মত মান দিয়ে শুরু করতে পারেন

class ViewController: UIViewCOntroller {
    // Set an initial value for the variable
    var x: Double = 0
    // or an optional String
    var y: String?
    // or
    let z: Int = 2
}

তাহলে এর সমাধান কী?
মার্টিয়ান2049

পরিবর্তে তারা একটি init ফাংশনে উদ্ভাবিত হতে পারে?
মার্টিয়ান2049

13

এই সমস্যাটি সাধারণত তখন উপস্থিত হয় যখন আপনার কোনও ভেরিয়েবলের কোনও মূল্য থাকে না বা আপনি "যুক্ত করতে ভুলে যান!" এটি সেট না হওয়া পর্যন্ত এই পরিবর্তনশীলটিকে নীল সঞ্চয় করতে জোর করে।

আপনার ক্ষেত্রে সমস্যাটি এখানে রয়েছে:

var delegate: AppDelegate

var delegate: AppDelegate!এটিকে এমন একটি make চ্ছিক হিসাবে নির্ধারণ করা উচিত যা মান ব্যবহার না করা অবধি পরিবর্তনশীল এবং ভেরিয়েবলটিকে মোড়ক না করে।

এটি দুঃখজনক যে Xcode পুরো শ্রেণিটিকে ত্রুটি হিসাবে হাইলাইট করে পরিবর্তিত কোডের নির্দিষ্ট লাইনটিকে হাইলাইট করার পরিবর্তে এটি চিহ্নিত করতে কিছুটা সময় নেয়।


এটি আইবিআউটলেট ক্ষেত্রে আমার জন্য ত্রুটি বার্তা থেকে মুক্তি পেতে পারে তবে মানক ভেরিয়েবলের ক্ষেত্রে নয়।
টিম ভার্মিউলেন 21

এটি আমার সমস্যা সমাধান করে। যখন আমি এটি করার চেষ্টা করেছি: var fetchedResultsController: NSFetchedResultsController আমি সংকলনের ত্রুটি পেয়েছি। যোগ করে "!" ত্রুটিটি চলে গেল, যেমন ভেরি ফেচারডাল্টস কন্ট্রোলার: এনএসফ্যাচড্রিজাল্টস কনট্রোলার!
জার্ভিসবায়ে

আপনার উত্তরগুলির জন্য ধন্যবাদ! এটি আমার পক্ষে শ্রুতিমধুর, আমি কেবল "" জানি? optionচ্ছিক মান তবে "!" এর আগে আমার জানা ছিল না। আমি সেট করলাম "!" যে মত: বার সময়: এনএসটিমিকার!
এমনিগুইয়েন

10

যদি আপনি একটি "হারান!" নীচের কোডগুলির মতো আপনার কোডেও আপনি এই ত্রুটিটি পেয়ে যাবেন।

import UIKit

class MemeDetailViewController : UIViewController {

    @IBOutlet weak var memeImage: UIImageView!

    var meme:Meme! // lost"!"

    override func viewWillAppear(animated: Bool) {

        super.viewWillAppear(animated)
        self.memeImage!.image = meme.memedImage
    }

    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
    }

}

3

প্রতিস্থাপন var appDelegate : AppDelegate?সঙ্গে let appDelegate = UIApplication.sharedApplication().delegateযেমন দ্বিতীয় মন্তব্য লাইনে hinted viewDidLoad()

KEYWORD "ঐচ্ছিক" ব্যবহার ঠিক বোঝায় ?দেখুন এই আরো বিস্তারিত জানার জন্য।


1

আমি এক্সকোড 7 এবং সুইফট 2 ব্যবহার করি, সর্বশেষে, আমি তৈরি করেছিলাম:

শ্রেণি ভিউ কন্ট্রোলার: ইউআইভিউউকন্ট্রোলার {বার সময়: এনএসটিমেমার // এখানে ত্রুটি}

তারপরে আমি ঠিক করেছি: শ্রেণি ভিউকন্ট্রোলার: ইউআইভিউকন্ট্রোলার {

var time: NSTimer!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewWillAppear(animated: Bool) {
    //self.movetoHome()
    time = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(ViewController.movetoHome), userInfo: nil, repeats: false)
    //performSegueWithIdentifier("MoveToHome", sender: self)
    //presentViewController(<#T##viewControllerToPresent: UIViewController##UIViewController#>, animated: <#T##Bool#>, completion: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>)
}

func movetoHome(){
    performSegueWithIdentifier("MoveToHome", sender: self)
}

}


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

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