ক্লাস ভেরিয়েবলগুলি এখনও সমর্থিত নয়


93

আমি আমার প্রকল্পটিকে প্রাথমিক ভিউ কন্ট্রোলার হিসাবে একটি স্প্লিট ভিউ কন্ট্রোলার দিয়ে শুরু করি এবং স্টোরিবোর্ড থেকে এটি স্বয়ংক্রিয়ভাবে শুরু করি।

সাধারণত, এই ইউআই সহ একটি অ্যাপ্লিকেশনটিতে রুট হিসাবে একটি এবং কেবল একটি স্প্লিট ভিউ কন্ট্রোলার থাকে, তাই আমি সাবক্লাসে একটি স্ট্যাটিক ভেরিয়েবল তৈরি করি এবং আরম্ভের সময় এটি সেট করে রাখি ।

সুতরাং আমি দ্রুত সঙ্গে এই আচরণ চেষ্টা করতে চান।

আমি টাইপ প্রপার্টি (স্ট্যাটিক এবং ক্লাস কীওয়ার্ড সহ) সম্পর্কিত আইবুকের উপর সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ গাইড বইটি পড়েছি এবং চাকরিতে কোডের একটি অংশ চেষ্টা করছি:

import UIKit

class SplitViewController: UISplitViewController {

    class func sharedInstance() -> SplitViewController {
        return SplitViewController.instance
    }

    class let instance: SplitViewController = nil

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        self.initialization()
    }

    init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder);
        self.initialization()
    }

    func initialization() {
        SplitViewController.instance = self;
    }
}

তবে যখন আমি Xcode বলি ধরণের বৈশিষ্ট্যগুলির শ্রেণীবদ্ধ কীওয়ার্ডটি সমর্থন করে না তখন আমি বুঝতে পেরেছিলাম।

ছবিতে ত্রুটি বিশদ

এটি করার কোনও সমাধান কি আপনার ছিল?


আপনি যদি 'লে'কে' ভের 'দিয়ে প্রতিস্থাপন করেন তবে কী হবে?
জুনটজু

এটি একই ত্রুটি দেয়।
সেজার

4
এটি প্রথম বীজ, শান্ত হও। :) বইটি যদি এটি সমর্থন করে এবং এটি এখনও উপলভ্য না থেকে থাকে তবে তা হবে । এমনকি ত্রুটিটি "এখনও" বলে
আকাশীবস্কি

4
হ্যাঁ @ কাকাশিভস্কি আপনার যুক্তি আছে তবে আমার পক্ষে ভুল ও ত্রুটি হতে পারে এবং কারও সাথে এই আচরণ করার সমাধান রয়েছে ...
ভিনসেন্ট সালুজ্জো

4
@ লেসপোমস অ্যাপল যে কোনও মুলতুবি আছে সে সম্পর্কে কুখ্যাতভাবে কঠোর-লিপযুক্ত। এটি তাদের জন্য বিব্রতকর যে এই জাতীয় মানক এবং স্পষ্ট বৈশিষ্ট্যটি তাদের নতুন ফ্ল্যাগশিপ ভাষার বিশাল প্রকাশের থেকে অভাব ছিল। সুইফট গুরুতর ব্যবহারের জন্য প্রস্তুত হওয়ার আগে অনেকগুলি উন্নতি প্রয়োজন।
হাইপারবোলে

উত্তর:


37

ক্লাসে স্থিতিশীল ভেরিয়েবলের জন্য এখন সুইফ্টের সমর্থন রয়েছে। এটি ক্লাস ভেরিয়েবলের মতো ঠিক একই নয় (কারণ তারা সাবক্লাস দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হয় না), তবে এটি আপনাকে বেশ কাছাকাছি পেয়ে যায়:

class X {
  static let y: Int = 4
  static var x: Int = 4
}

println(X.x)
println(X.y)

X.x = 5

println(X.x)

4
যেমন বিল বলেছেন, এটি একই নয় তবে এটি আমার দরকার!
ভিনসেন্ট সালুজ্জো

@ ভিনসেন্টসালুজ্জো, (এবং বিল) এই এবং শ্রেণি পরিবর্তকের মধ্যে পার্থক্য কী?
স্কাইওয়ান্ডার

অ্যাপল ডকুমেন্টেশনটি স্থিতি আপডেট করার জন্য সম্প্রতি পরিবর্তিত হয়েছে: ডেভেলপার.এপ্লে /class লাইব্রেরি / আইস / ডকুমেন্টেশন / সুইফট / কনসেপ্টুয়াল/… আসলে, কীওয়ার্ডটি এখন কেবল গণিত বৈশিষ্ট্যগুলির জন্য ব্যবহৃত হতে পারে এবং স্ট্যাটিক সব ধরণের বৈশিষ্ট্যের জন্য (এনাম, শ্রেণিতে) বা স্ট্রাক্ট)
ভিনসেন্ট সালুজ্জো

@ স্কাইওয়িন্দার আমি আমার উত্তরে যেমন উল্লেখ করেছি, সত্য শ্রেণীর পরিবর্তনশীলগুলি সাবক্লাস দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে। স্ট্যাটিক ভেরিয়েবলগুলি পারে না।
বিল

@ ভিনসেন্টসালুজ্জো অ্যাপল কি তার নথিটি আপডেট করে? বিকাশকারী.অ্যাপল. com/library/ios/docamentation/Swift/Concepual/… চতুর্থ অনুচ্ছেদ দেখুন: "মান ধরণের জন্য (যা, কাঠামো এবং গণনা) জন্য, আপনি সঞ্চিত এবং গণিত ধরণের বৈশিষ্ট্য সংজ্ঞায়িত করতে পারেন। শ্রেণীর জন্য, আপনি পারেন শুধুমাত্র গণনামূলক প্রকারের বৈশিষ্ট্য নির্ধারণ করুন। "
ফুজিয়ানজিন 6471

73

স্ট্রাক্ট এম্বেড করা ঠিকঠাক মতো কাজ করতে পারে:

class SomeClass
{
  // class var classVariable: Int = 0
  // "Class variables not yet supported." Weird.

  // Workaround:
  private struct SubStruct { static var staticVariable: Int = 0 }

  class var workaroundClassVariable: Int
  {
    get { return SubStruct.staticVariable }
    set { SubStruct.staticVariable = newValue }
  }
}

সোমারক্লাস.ওয়ার্কআরাউন্ডক্লাসভ্যারিযোগ্য গণিত প্রকারের সম্পত্তিটি তখন ব্যবহার করা যেতে পারে যেন এটি কোনও সঞ্চিত ধরণের সম্পত্তি।


4
আমার জন্য কাজ করেছেন - এক্সকোড .০ যেমন আমাকে 'পাবলিক' বাদ দিতে হয়েছিল তা ছাড়া আমি কোনও অভ্যন্তরীণ শ্রেণীর মধ্যে পাবলিক ক্লাস ঘোষণা করা পছন্দ করে না।
আলী বিডল

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

19

ফাইল স্কোপটিতে স্থিতিশীল স্টোরেজ সময়কালের সাথে ভেরিয়েবলগুলি ঘোষণা করা সম্ভব বলে মনে হয় (সি হিসাবে):

var sharedInstance: SplitViewController? = nil

class SplitViewController: UISplitViewController {
    ....
    func initialization() {
        sharedInstance = self
    }
}

মিমিএমএইচ, কেন নয়, তবে ফাইল স্কোপটিতে একটি ভ্যারিকে সংজ্ঞায়িত করা দীর্ঘ সময়ের ব্যবহারে একটি মেমরি ফাঁস করে না?
ভিনসেন্ট সালুজ্জো

@ ভিনসেন্টসালুজ্জো সুইফটের আগে আপনি যা করেছিলেন তার সাথে কোনও পার্থক্য নেই: একমাত্র উদাহরণটি একটি স্ট্যাটিক ভেরিয়েবলের মধ্যে সঞ্চয় করুন। প্রক্রিয়াটি দীর্ঘকাল বেঁচে থাকার একক উদাহরণ ব্যতীত এখানে ফাঁস হওয়ার মতো কিছুই নেই।
নিকোলাই রুহে

আমি নিজের ক্লাসের সাথে খেলার মাঠে এটি চেষ্টা করেছি। এটি কাজ করে না কারণ আপনি "স্ট্যাটিক" ভারটি আরম্ভ করার সময় ক্লাসটি এখনও ঘোষিত হয়নি। আমি এটি এক্সকোড প্রকল্পে চেষ্টা করে দেখিনি (আমার ধারণা এটি অবশ্যই সেখানে কাজ করেছে?)। সুতরাং আপনার যখন ক্লাসের জন্য প্রোটোকল নির্দিষ্ট করার সময় আপনি সর্বদা করেন তেমন "ক্লাস ফরোয়ার্ড ডিক্লেয়ারেশন" বের করার দরকার হতে পারে।
কাভিংকেলভিন

4
নোট করুন যে এক্সকোড .0.০-তে আপনার একই নাম সহ দুটি ফাইল স্কোপ ভেরিয়েবল থাকতে পারে না private
nschum

নিখুঁতভাবে
নিকোলাই রুহে

14

আমার পছন্দের পদ্ধতিটি হ'ল ক্লাসের বাইরে কেবল একটি প্রাইভেট ফাইল স্কোপ ভেরি ব্যবহার করা এবং তারপরে ক্লাস / স্ট্যাটিক গেটার এবং সেটটারগুলি প্রয়োগ করা:

private var _classVar: Int = 0;

class SomeClass
{
    public class var classVar: Int
    {
        get { return _classVar }
        set { _classVar = newValue }
    }
}

5

সুইফট 1.2 হিসাবে (এক্সকোড 6.3 বি 1 এবং এর পরে উপলব্ধ), staticশ্রেণীর বৈশিষ্ট্য এবং পদ্ধতিগুলি সমর্থিত।

class SomeClass
{
    static var someVariable: Int = 0
}

4
তারা যদি কেবলমাত্র চলকটিকে অবমূল্যায়ন করে থাকে class, বা কোনও পার্থক্য রয়েছে ( staticস্ট্রাক্টের classজন্য, ক্লাসগুলির জন্য ব্যবহৃত হত ) তবে আপনি কী ধরেন ?
ক্রিস কনভারের

@ ক্রিসকো রিলিজে উল্লেখ করা হয়েছে যে এটির staticজন্য একটি নাম class final
Andreas Ley


4

ফাইল স্কোপের ক্ষেত্রে বর্ণের চেয়ে যথেষ্ট সমান একটি সমাধান তবে আরও কাস্টমাইজেবল এবং সিংগেলনের কাছাকাছি এমন স্ট্রাক্ট ব্যবহার করা যা ক্লাসের সম্পত্তি হিসাবে স্ট্যাটিক ভার সমর্থন করে

struct PersonSharedData {
    static var backstore = ""
    var data: String {
    get { return PersonSharedData.backstore }
    set { PersonSharedData.backstore = newValue }
    }
}

class Person {
    var shared=PersonSharedData() //<< pseudo class var
    var family: String {
        get { return shared.data }
        set { shared.data=newValue }
    }
    var firstname = ""
    var lastname = ""
    var sexe: Sexe = .Unknown
}

2

ঠিক আছে, নিকোলাইয়ের সমাধানটি যা কাজটি করে। আমি তথ্যের জন্য এই থ্রেডে আমার পরিবর্তনগুলি পোস্ট করি

var instance: SplitViewController? = nil

class SplitViewController: UISplitViewController {

    class func sharedInstance() -> SplitViewController? {
        return instance;
    }

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        self.initialization()
    }

    init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder);
        self.initialization()
    }

    func initialization() {
        instance = self
    }
}

এবং উদাহরণস্বরূপ, আমার অ্যাপ্লিকেশনগুলিতে আমি এই স্থিতিশীল পদ্ধতিটি এর মতো অ্যাক্সেস করতে পারি

SplitViewController.sharedInstance()!.presentsWithGesture = false

আমি কেবল কৌতূহলী, তবে ভেরিয়েবল "উদাহরণ" বৈশ্বিক পরিবর্তনশীল না? এর অর্থ হ'ল যদি আপনার আরও একটি সিঙ্গলটন ক্লাস থাকে তবে আপনার ভেরিয়েবল "উদাহরণ" ওভাররাইট করা হবে, তাই না?
রাফেল 15

1

ত্রুটির শব্দটি ভারীভাবে বোঝায় এটি ভবিষ্যতে একটি ভাষা বৈশিষ্ট্য হবে।

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


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

1

আপনাকে একটি অভ্যন্তরীণ কাঠামের ভেরিয়েবলের মধ্যে বর্গ ভেরিয়েবলগুলি আবৃত করতে হবে

class Store{
    var name:String
    var address:String
    var lat:Int
    var long:Int
    init(name:String, address:String, lat:Int, long:Int){
        self.name = name
        self.address = address
        self.lat = lat
        self.long=long
    }

    private struct FACTORY_INITIALIZED_FLAG { static var initialized: Bool = false
       static var  myStoreList:[Store]?
        static func getMyStoreList()->[Store]{
            if !initialized{
                println("INITIALIZING")
                myStoreList = [
                    Store(name: "Walmart", address: "abcd", lat: 10, long: 20),
                    Store(name: "JCPenny", address: "kjfnv", lat: 23, long: 34)
                ]
                initialized = true
            }
                return myStoreList!
    }
    }
}


var a = Store.FACTORY_INITIALIZED_FLAG.getMyStoreList()

var b = Store.FACTORY_INITIALIZED_FLAG.getMyStoreList()

// only prints INITIALIZING once


0

এটিকে সুইফটে টাইপ প্রপার্টি বলা হয় ।

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

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}
enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 6
    }
}
class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}

নীচের লিঙ্কে আরও পড়ুন,

https://developer.apple.com/library/ios/docamentation/Swift/Concepual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254

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