একটি ঘোষণাপত্র সুইফট ১.২ এ 'চূড়ান্ত' এবং 'গতিশীল' ত্রুটি উভয়ই হতে পারে না


123

valueনীচের ঘোষণা

import Foundation

class AAA: NSObject {
    func test2() {
        self.dynamicType
    }
}
extension AAA {
    static let value    =   111
}

নিম্নলিখিত সংকলন ত্রুটির কারণ

A declaration cannot be both 'final' and 'dynamic'

কেন এটি ঘটে এবং আমি কীভাবে এটি মোকাবেলা করতে পারি?

আমি সুইফট 1.2 ব্যবহার করছি (এক্সকোড 6.3.1 6D1002 এর মধ্যে পাঠানো সংস্করণ)


func test2ঘোষণা Xcode 7.3.1 হিসাবে, ত্রুটি ট্রিগার প্রয়োজন হয় না।
রব মায়ফ 1921


কেবল স্থিতিশীল ভেরিয়েবলটিকে আরও একটি ভাল নামকরণ
কাঠামোর মধ্যে রাখুন

উত্তর:


224

এই সমস্যাটি দেখা দিয়েছে কারণ শ্রেণিটি উত্তরাধিকার সূত্রে প্রাপ্ত হওয়ার কারণে সুইফট ওবজে-সি সামঞ্জস্যের জন্য স্ট্যাটিক সম্পত্তির জন্য একটি গতিশীল অ্যাকসেসর তৈরি করার চেষ্টা করছে NSObject

যদি আপনার প্রকল্পটি কেবল varঅ্যাক্সেসর ব্যবহার না করে কেবল @nonobjcসুইফটে থাকে তবে আপনি সুইফট ২.০-তে বৈশিষ্ট্যটির মাধ্যমে সমস্যাটি এড়াতে পারবেন :

import Foundation

class AAA: NSObject {}
extension AAA {
    @nonobjc static let value = 111
}

আমার প্রকল্পে কিছু উদ্দেশ্যমূলক-সি ফাইল রয়েছে, তবে সেই কোডটির কোনওটিই এই শ্রেণীর উদাহরণগুলির সাথে ইন্টারেক্ট করে না ( AAAএখানে), সুতরাং আমি অনুমান করি যে আমি পরিষ্কার?
নিকোলাস মিয়ারি

খাঁটি সুইফ্ট কোডবেস ব্যবহার করা হলে এটি নির্বাচিত উত্তর হওয়া উচিত।
idzski

আমি একটি NSManagedObjectসাবক্লাসে স্ট্যাটিক (ক্লাস) ভার্স যুক্ত করার চেষ্টা করছিলাম । এটি স্থির!
নিকোলাস মিয়ারি

এক্সকোড 7.3 এর জন্য সোর্সকিট সার্ভিস সম্পূর্ণরূপে স্ক্রু করতে এই ফিক্সটি আমি খুঁজে পেয়েছি?
নুডলঅফডেথ

57

আপনার শ্রেণি যদি এই শর্তগুলি সন্তুষ্ট করে তবে আপনি এই ত্রুটিটি পাবেন।

  • থেকে সাবক্ল্যাসড NSObject
  • একটি static letমাঠ আছে।
  • মাধ্যমে একটি উদাহরণ পদ্ধতি থেকে ক্ষেত্রটি অ্যাক্সেস করে dynamicType

কেন হয় তা আমি জানি না, তবে আপনি এই চেষ্টাটি করতে পারেন।

static var value: Int {
    get {
        return 111
    }
}

বা সংক্ষিপ্ত আকারে।

static var value: Int {
    return 111
}

static var { get }পরিবর্তে ব্যবহার করুন static let


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

যদি আপনি এই জাতীয় মান গণনার ব্যয় সম্পর্কে উদ্বিগ্ন হন তবে আপনি এটি একবার তৈরি করতে এবং এই জাতীয় ক্যাশে করতে পারেন।

static var value: Int {
    return cache
}
private let cache = getTheNumber()

অথবা আপনি যদি ক্যাশের অস্তিত্ব পুরোপুরি গোপন করতে চান তবে এটি পছন্দ করুন।

static var value: Int {
    struct Local {
        static let cache = getTheNumber()
    }
    return Local.cache
}

5
এটি একটি গণিত সম্পত্তি উত্পন্ন করে, যা প্রতিটি অ্যাক্সেসে পুনরায় গণনা করা হবে। এই ক্ষেত্রে এটি খুব বেশি গুরুত্বপূর্ণ নাও হতে পারে, তবে আমি মনে করি এটি উল্লেখ করার মতো যাতে কেউ বড় আকারের অবজেক্টগুলির জন্য এই কাজটি ব্যবহার না করে।
নিক পোদ্রাতজ

@ নিকপোড্রেটজ এই কি একটি গণনা করা সম্পত্তি হবে? private static let _value: Int = 111 static var value: Int { return _value }এটিতে নেই get {তবে varlet
সংকলকটি

1
@ হ্যাশিয়ার এটি কোঁকড়া ধনুর্বন্ধনী ব্রেসেসের ভিতরে আপনি একটি ক্লোজার তৈরি getকরেন, এই ক্ষেত্রে এটি অন্তর্নিহিত। আপনি কি বদলে কি করতে পারেন বরাদ্দ পরিবর্তনশীল যাতে অবসান শুধু একবার বলা হয় অবসান ফলাফল: let value: Int = { return 111 }()। শেষে বন্ধনীগুলি বন্ধ বলে call তবে সচেতন হন যে এটি আবার একটি সঞ্চিত সম্পত্তি এবং তাই এক্সটেনশনে উপলব্ধ নয়।
নিক পোদ্রাতজ

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

18

আমারও এই ত্রুটি ছিল

আমার সমস্যাটি একটি সুইফ্ট এক্সটেনশনে কেবল স্থিতিশীল ভার ছিল।

extension NotificationsViewController: UITableViewDataSource , UITableViewDelegate {

    static var timeIntervalFormatter = NSDateComponentsFormatter()

}

শ্রেণি বাস্তবায়নে এটিকে সরানো আমার জন্য সমস্যার সমাধান করেছে।


7

আমি ঠিক একই কারণে একটি ভিন্ন কারণ নিয়ে হোঁচট খেয়েছি এবং একই অনর্থক ত্রুটির বার্তাটি অনুভব করা অন্যান্য লোকদের জন্য এটি এখানে পোস্ট করতে চাই।

একটি চূড়ান্ত শ্রেণি যা কোনও এক্সটেনশনে সংজ্ঞায়িত কোনও গণিত ভেরিয়েবলকে ওভাররাইড করে তাও এই ত্রুটি ঘটায়। এটি যদিও ফাংশনগুলির জন্য কাজ করে এবং এটি একটি সংকলক বাগের মতো দেখায়।

// at line 0: a declaration cannot be both 'final' and 'dynamic'

import UIKit

extension UIViewController {
    var test: Int { return 0 }
}

final class TestController: UIViewController {
    override var test: Int { return 1 }
}

7

আমি এক্সটেনশনে সংজ্ঞায়িত নতুন স্ট্রাক্টের স্থিতিশীল ঘোষণাকে সরিয়ে এই সমস্যাটি সমাধান করেছি।

সুতরাং এর পরিবর্তে:

extension NSOperationQueue {
    static var parsingQueue : NSOperationQueue = {
        let queue = NSOperationQueue()
        queue.maxConcurrentOperationCount = 1
        return queue
        }()
}

আমার আছে এটা:

extension NSOperationQueue {        
    struct Shared {
        static var parsingQueue : NSOperationQueue = {
            let queue = NSOperationQueue()
            queue.maxConcurrentOperationCount = 1
            return queue                
            }()
    }
}

0

এই ত্রুটি রোধ করতে আপনি এটি ব্যক্তিগত হিসাবে চিহ্নিত করতে পারেন। আপনি যদি এটি প্রকাশ করতে চান তবে আপনি এটি একটি সর্বজনীন কার্যক্রমে গুটিয়ে রাখতে পারেন:

extension AAA {

    private static let value = 111

    public func getDatValue() -> Int {
        return AAA.value
    }    
}

আমার ক্ষেত্রে, আমি কেবল সম্পত্তিটি এক্সটেনশনেই উল্লেখ করেছি, সুতরাং এটি প্রকাশ করার দরকার নেই।


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