দশম শ্রেণির অবজেক্ট দশম সুইফটে মেথডসাইনচার ফরফর্সিটেক্টর প্রয়োগ করে না


89

আমার ক্লাস পার্সন রয়েছে যা একাধিকবার ইনস্ট্যান্ট হয়। প্রত্যেক ব্যক্তি তাদের নিজস্ব টাইমার পান। আমার initজন্য Personআমি কল startTimer()

class Person {
 var timer = NSTimer()
 func startTimer() {
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("timerTick"), userInfo: nil, repeats: true)
 }

 func timerTick() {
    angerLevel++
    println("Angry! \(angerLevel)")
 }
...
...
}

সুতরাং আমার কাছে অ্যারেতে ব্যক্তির 3 টি উদাহরণ থাকতে পারে Person[]। আমি একটি ত্রুটি পাচ্ছি:

2014-06-25 13:57:14.956 ThisProgram[3842:148856] *** NSForwarding: warning: object 0x113760048 of class '_TtC11ThisProgram6Person' does not implement methodSignatureForSelector: -- trouble ahead

আমি অন্য কোথাও পড়েছি যে আমার উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া উচিত NSObjectতবে এটি সুইচটিতে নয় ওবজ-সি। ফাংশনটি ক্লাসের মধ্যে রয়েছে তাই আমি কী করব তা নিশ্চিত নই।


4
আপনি ইতিমধ্যে মূর্ত আউট যে বর্গ NSObject থেকে উত্তরাধিকারী হবে: class Person : NSObject { ... }। আপনি কি আলাদা সমাধান খুঁজছেন?
মার্টিন আর

উত্তর:


160

মনে করবেন না NSObjectএকটি উদ্দেশ্য-সি শ্রেণী হিসেবে, একটি কোকো / ফাউন্ডেশন শ্রেণী হিসেবে মনে করি। আপনি যদি উদ্দেশ্য-সি এর পরিবর্তে সুইফ্ট ব্যবহার করছেন তবে আপনি এখনও একই ফ্রেমওয়ার্কগুলি ব্যবহার করছেন।

দুটি বিকল্প: (1) dynamicআপনি নির্বাচক হিসাবে উল্লেখ করতে চান এমন ক্রিয়ায় বিশিষ্টতা যুক্ত করুন:

    dynamic func timerTick() {
        self.angerLevel++
        print("Angry! \(self.angerLevel)")
    }

বা (২) এর Personসাবক্লাস হিসাবে ঘোষণা করুন NSObject, তারপরে কেবল super.init()আপনার আরম্ভকারীটির শুরুতে কল করুন:

class Person: NSObject {
    var timer = NSTimer()
    var angerLevel = 0

    func startTimer() {
        print("starting timer")
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "timerTick", userInfo: nil, repeats: true)
    }

    func timerTick() {
        self.angerLevel++
        print("Angry! \(self.angerLevel)")
    }

    override init() {
        super.init()
        self.startTimer()
    }
}

4
আপনারও এই জাতীয় ক্রিয়াকলাপটি সাজাতে সক্ষম হওয়া উচিত @objc func timerTick()। এনএসটিমির এপিআই ওবজ-সি রানটাইমের উপর বেশ নির্ভরশীল বলে মনে হচ্ছে।
ম্যাকশোম

ভাল কল - উত্তরে যুক্ত হয়েছে
ন্যাট কুক

4
ধন্যবাদ এই আমার সমস্যা স্থির। তবে কেন আপনি ব্যাখ্যা করতে পারেন? এটি @objc অংশের কী দরকার?
আগ্রাসী

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

4
এই সমাধানগুলির কোনওটিরই আর দরকার নেই। এটি নির্বাচক ফাংশন ঘোষণার জন্য যথেষ্ট dynamic। তারা উভয়ই ভাল এবং তারা উভয় এখনও কাজ করে, তবে dynamicএই ফাংশনটি ব্যবহার করে আরও হালকা ওজনের পদ্ধতির দেখা যেতে পারে।
ম্যাট

32

এক্সকোডি 6 বিটা 6 থেকে আপনি 'ডায়নামিক' ফানক ব্যবহার করতে পারেন

dynamic func timerTick() { .... }

এটি ইউআইএলোক্যালাইজড ইন্ডেক্সডক্ল্যাডকেনশন ক্যালকোলেশন ()
ডগকফি

পুরো ক্লাসটিকে এনএসবজেক্ট থেকে উত্তরাধিকারী করে তোলা এটি একটি আরও ভাল পদ্ধতির।
ববিকগুলি

8

let encodedArchive = NSKeyedArchiver.archivedDataWithRootObject(archive) as NSDataসংরক্ষণাগারটি কাস্টম শ্রেণীর একটি অ্যারে ছিল এমনটি ব্যবহার করার চেষ্টা করার সময় আমার একই রকম ত্রুটি হয়েছিল। আমি দেখতে পেয়েছি যে কাস্টম ক্লাসটিকে এনএসওজেক্ট এবং এনএসকোডিংয়ের সাবক্লাস হিসাবে ঘোষণা করার কৌশলটি কার্যকর হয়েছিল। এনএসকোডিংয়ের প্রোটোকলের সাথে সামঞ্জস্য হতে এর জন্য আরও কয়েকটি লাইন লাগবে যাতে এটি শুরু করার মতো কিছু দেখতে লাগবে:

class Person: NSObject, NSCoding {
  init() {
    super.init()
  }

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