স্থগিত ধ্রুবককে কীভাবে দ্রুতগতিতে শ্রেণিতে নির্ধারণ করতে হয় to


105

আমার ফাংশনে আমার এই সংজ্ঞা রয়েছে যা কাজ করে

class MyClass {
    func myFunc() {
        let testStr = "test"
        let testStrLen = countElements(testStr)
    }
}

তবে আমি যদি 'টেস্টএসটিআর' এবং 'টেস্টস্ট্রিলেন' ক্লাস স্তরে নিয়ে যাই তবে এটি সংকলন করবে না। এটি বলেছে যে 'মাইক্লাস। টাইপটির' টেস্টএসটিআর 'নামে সদস্য নেই।

class MyClass {
    let testStr = "test"
    let testStrLen = countElements(testStr)

    func myFunc() {

    }
}

আমি এটা কিভাবে ঠিক করবো? আমি প্রতিবার একটি ধ্রুবক 'পরীক্ষার' লেন গণনার জন্য জরিমানা দিতে চাই না।

নীচের মন্তব্যগুলি সম্পর্কে আমার বোঝার ভিত্তিতে, আমাকে এটি করা দরকার:

class MyClass {
    let testStr = "test"
    let testStrLen = countElements("test")

    func myFunc() {

    }
}

"টেস্ট" দু'বার টাইপ / প্রবেশ করার দরকার নেই এমন কোন উপায় আছে কি? ধন্যবাদ।


3
ভিউকন্ট্রোলের সম্ভাব্য সদৃশ। টাইপের সদস্যের নাম নেই (কোনও সম্পত্তির প্রাথমিক মূল্য অন্য সম্পত্তির উপর নির্ভর করতে পারে না
মার্টিন আর

1
সিজিআরেক্টমেকের (অলস সম্পত্তি ব্যবহার করে একটি দুর্দান্ত সমাধান সহ ) এক্স এবং ওয়াইয়ের সম্ভাব্য নকল
মার্টিন আর

"দু'বার" পরীক্ষা "টাইপ / প্রবেশ করার দরকার নেই এমন কোনও উপায় কি?" - হ্যাঁ. টেস্টএসটিলেনের প্রারম্ভিককরণটি একটি init পদ্ধতিতে সরান (প্রথম সম্ভাব্য নকলের জবাব হিসাবে পরামর্শ দেওয়া হয়েছে), বা একটি অলস সূচনাকরণ (দ্বিতীয় সম্ভাব্য সদৃশটির উত্তর হিসাবে প্রস্তাবিত) ব্যবহার করুন।
মার্টিন আর

উত্তর:


177

সুইফটে কোনও শ্রেণীর জন্য ধ্রুবকগুলি ঘোষণার জন্য একটি দুর্দান্ত আইডিয়ামটি হ'ল মাইক্লাসকন্টাস্ট্যান্টস নামের নীচের মতো একটি কাঠামো ব্যবহার করা।

struct MyClassConstants{
    static let testStr = "test"
    static let testStrLength = countElements(testStr)

    static let arrayOfTests: [String] = ["foo", "bar", testStr]
}

এইভাবে আপনার ধ্রুবকগুলি বিশ্বব্যাপী ভাসমান পরিবর্তে ঘোষিত কনস্ট্রাক্টের মধ্যে বিভক্ত হবে।

হালনাগাদ

স্ট্যাটিক অ্যারে প্রারম্ভিককরণ সম্পর্কে জিজ্ঞাসা করা মন্তব্যের জবাবে আমি একটি স্ট্যাটিক অ্যারে ধ্রুবক যুক্ত করেছি। "দ্য সুইফ্ট প্রোগ্রামিং ভাষা" এ অ্যারে লিটারালগুলি দেখুন ral

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


2
আপনি কি পরিবর্তে কেবল স্থিরদের ব্যক্তিগত হিসাবে ঘোষণা করতে পারবেন না? তারা কি আর বৈশ্বিক হবে না?
sethfri

3
আমি এনাম হিসাবে ব্যবহার করছিলাম .rawValue ব্যবহার করে মারধর করুন
ডগকফি


1
এএস এবং এএস-এ staticধ্রুবকগুলি ঘোষণার মধ্যে পার্থক্য কী ? StructClass
জৌজি

1
@ ইয়ুং সুইফট ২.২ গণনাগুলি কাজ করতে পারে তবে সাধারণভাবে কেবল ধ্রুবককে গ্রুপিংয়ের চেয়ে আরও শক্তিশালী শব্দার্থক সংঘবদ্ধতাযুক্ত এনামগুলি । লিঙ্কটিতে, সুইফট এনামগুলিতে সম্পর্কিত মান এবং কাঁচা মান উভয়ই বৈশিষ্ট্যযুক্ত। আপনি কাঁচা মানগুলি ব্যবহার করতে পারেন, তবে বাক্যটি হ'ল MyClassConstants.testStr.rawValueমানটি অ্যাক্সেস করার জন্য, যা কেবল সিনট্যাকটিকভাবে বন্ধুত্বপূর্ণ নয় MyClassConstants.testStr
মার্টিন উলস্টেনহুলমে

72

@ মার্টিনের উত্তরে যুক্ত করা হচ্ছে ...

যদি কেউ অ্যাপ্লিকেশন স্তরের ধ্রুবক ফাইল রাখার পরিকল্পনা করে তবে আপনি ধ্রুবকটিকে তাদের ধরণ বা প্রকৃতির উপর ভিত্তি করে গোষ্ঠীভুক্ত করতে পারেন

struct Constants {
    struct MixpanelConstants {
        static let activeScreen = "Active Screen";
    }
    struct CrashlyticsConstants {
        static let userType = "User Type";
    }
}

কল করুন: Constants.MixpanelConstants.activeScreen

5/5/2019 আপডেট করুন (টপিক বন্ধ কিন্তু but‍♂️)

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

ENUMS

আরও নিরাপদ এবং স্পষ্ট প্রতিনিধিত্বের সাথে এনাম ব্যবহার করে এটি অর্জন করা যায়

enum Constants {
    enum MixpanelConstants: String {
        case activeScreen = "Active Screen";
    }
    enum CrashlyticsConstants: String {
        case userType = "User Type";
    }
}

print(Constants.MixpanelConstants.activeScreen.rawValue)

2
ধন্যবাদ. আমি এটি পছন্দ করি, স্ট্রাক্টের মাধ্যমে ধ্রুবকদের পরিচালনা করার জন্য একটি মার্জিত উপায় সরবরাহ করি।
অভিজিৎ

1
আরো উদাহরণ আমি আরো ভালো পদ্ধতির যুক্ত করেছেন এখানে
Anish পরাজুলি 웃

15

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি জিজ্ঞাসা করছেন যে আপনি শ্রেণি স্তরের ধ্রুবকগুলি কীভাবে তৈরি করতে পারেন (স্ট্যাটিক - সি ++ পার্লেন্সে) যেমন আপনি ক না) প্রতিটি ক্ষেত্রে ওভারহেডের প্রতিরূপ তৈরি করুন, এবং খ অন্যথায় ধ্রুবকটি পুনরায় সংশোধন করতে হবে।

ভাষাটি বিকশিত হয়েছে - যেমনটি প্রতিটি পাঠক জানেন তবে আমি এটি Xcode 6.3.1 এ পরীক্ষা করেছি, সমাধানটি হ'ল:

import Swift

class MyClass {
    static let testStr = "test"
    static let testStrLen = count(testStr)

    init() {
        println("There are \(MyClass.testStrLen) characters in \(MyClass.testStr)")
    }
}

let a = MyClass()

// -> There are 4 characters in test

আমি জানি না যে স্ট্যাটিকটি কঠোরভাবে প্রয়োজনীয় কারণ কম্পাইলার অবশ্যই বাইনারিটির স্থিতিশীল বিভাগে প্রতি কনস্ট ভেরিয়েবলের জন্য কেবল একটি এন্ট্রি যুক্ত করে, তবে এটি সিনট্যাক্স এবং অ্যাক্সেসকে প্রভাবিত করে। স্ট্যাটিক ব্যবহার করে, আপনি আপনি একটি দৃষ্টান্ত হবে না এমনকি যখন এটা উল্লেখ করতে পারেন: MyClass.testStrLen


11

যদি আপনি প্রকৃতপক্ষে আপনার শ্রেণীর স্থিতিশীল সম্পত্তি চান তবে তা বর্তমানে সুইফটে সমর্থিত নয়। বর্তমান পরামর্শটি বিশ্বব্যাপী ধ্রুবক ব্যবহার করে এটিকে ঘিরে ধরার জন্য:

let testStr = "test"
let testStrLen = countElements(testStr)

class MyClass {
    func myFunc() {
    }
}

আপনি যদি এর পরিবর্তে এগুলিকে উদাহরণ হিসাবে রাখতে চান তবে আপনি দৈর্ঘ্যের জন্য একটি অলস স্টোর হওয়া সম্পত্তি ব্যবহার করতে পারেন - এটি কেবলমাত্র প্রথমবার অ্যাক্সেস করার পরে মূল্যায়ন করা হবে, সুতরাং আপনি এটি বারবার গণনা করবেন না।

class MyClass {
    let testStr: String = "test"
    lazy var testStrLen: Int = countElements(self.testStr)

    func myFunc() {
    }
}

1
+1 খুব খারাপ সেখানে এখনও এই গ্লোবাল ভেরিয়েবলগুলির চেয়ে ভাল উপায় বলে মনে হয় না।
Drux

1
আমি জানি এই মুহুর্তে এটি একটি ভাষার প্রতিবন্ধকতা, তবে আমি সমস্ত মূল্যে গ্লোবালগুলি ব্যবহার করা এড়াতে চাই। আমি মনে করি স্ট্রাক্ট পাত্রে w / ClassNameConstants এর মতো কিছু ব্যবহার করা আপাতত আরও ভাল পদ্ধতির হবে।
জোড়ায়র


7

কেউ কেউ কিছু শ্রেণির ধ্রুবক পাবলিক চাইলে অন্যরা ব্যক্তিগত হতে পারে।

প্রাইভেট কীওয়ার্ড একই সুইফ্ট ফাইলের মধ্যে ধ্রুবকের পরিধি সীমাবদ্ধ করতে ব্যবহার করা যেতে পারে।

class MyClass {

struct Constants {

    static let testStr = "test"
    static let testStrLen = testStr.characters.count

    //testInt will not be accessable by other classes in different swift files
    private static let testInt = 1
}

func ownFunction()
{

    var newInt = Constants.testInt + 1

    print("Print testStr=\(Constants.testStr)")
}

}

অন্যান্য ক্লাসগুলি নীচের মতো আপনার শ্রেণি ধ্রুবকগুলিতে অ্যাক্সেস করতে সক্ষম হবে

class MyClass2
{

func accessOtherConstants()
{
    print("MyClass's testStr=\(MyClass.Constants.testStr)")
}

} 

2

খেলার মাঠে চেষ্টা করেছেন


class MyClass {

struct Constants { static let testStr = "test" static let testStrLen = testStr.characters.count //testInt will not be accessable by other classes in different swift files private static let testInt = 1 static func singletonFunction() { //accessable print("Print singletonFunction testInt=\(testInt)") var newInt = testStrLen newInt = newInt + 1 print("Print singletonFunction testStr=\(testStr)") } } func ownFunction() { //not accessable //var newInt1 = Constants.testInt + 1 var newInt2 = Constants.testStrLen newInt2 = newInt2 + 1 print("Print ownFunction testStr=\(Constants.testStr)") print("Print ownFunction newInt2=\(newInt2)") } } let newInt = MyClass.Constants.testStrLen print("Print testStr=\(MyClass.Constants.testStr)") print("Print testInt=\(newInt)") let myClass = MyClass() myClass.ownFunction() MyClass.Constants.singletonFunction()

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