वर्ग चर अभी तक समर्थित नहीं हैं


93

मैं अपनी परियोजना को प्रारंभिक दृश्य नियंत्रक के रूप में एक विभाजन दृश्य नियंत्रक के साथ शुरू करता हूं और इसे स्टोरीबोर्ड से स्वचालित रूप से शुरू करता हूं।

आम तौर पर, इस यूआई वाले ऐप में रूट के रूप में एक और केवल एक स्प्लिट व्यू कंट्रोलर होता है, इसलिए मैं ए बनाता हूं स्टैटिक वेरिएबल और इसे सेट करता जब इनिशियलाइजेशन किया गया था।

इसलिए मैं इस व्यवहार को तेजी के साथ करना चाहता हूं।

मैंने टाइपबुक (स्थिर और वर्ग कीवर्ड के साथ) और नौकरी के लिए कोड का एक टुकड़ा आज़माने के बारे में iBook पर स्विफ्ट प्रोग्रामिंग भाषा गाइड बुक पढ़ी:

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 का कहना है कि प्रकार के गुणों के लिए वर्ग कीवर्ड अभी तक समर्थित नहीं था।

छवि में त्रुटि विस्तार

क्या आपके पास ऐसा करने का कोई उपाय है?


यदि आप 'let' को 'var' से बदल देते हैं तो क्या होगा?
ज़ुनत्ज़ु

यह एक ही त्रुटि पैदा करता है।
सेज़र

1
यह पहला बीज है, शांत हो जाओ। :) अगर किताब कहती है कि यह समर्थित है और यह अभी तक उपलब्ध नहीं है, तो यह होगा । यहां तक ​​कि त्रुटि "अभी तक" कहती है ।
आकाशवाणी

1
हां @akashivskyy आपके पास कारण है, लेकिन यह हो सकता है और मेरी तरफ से त्रुटि हो सकती है और किसी के पास इस व्यवहार को करने के लिए एक समाधान है ...
विंसेंट सलुजो

1
@lespommes Apple कुछ भी है जो लंबित है के बारे में बहुत तंग है। यह उनके लिए शर्मनाक है कि इस तरह के एक मानक और स्पष्ट विशेषता को उनकी नई प्रमुख भाषा की विशाल रिलीज से कमी थी। गंभीर उपयोग के लिए स्विफ्ट तैयार होने से पहले कई सुधार आवश्यक हैं।
हाइपरबोले

जवाबों:


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)

1
जैसा कि बिल कहता है, यह वैसा नहीं है, लेकिन मुझे इसकी आवश्यकता है!
विंसेंट सलुजो

@VincentSaluzzo, (और बिल) इस और वर्ग चर के बीच क्या अंतर है?
स्काइविंदर

Apple प्रलेखन हाल ही में स्थिति को अद्यतन करने के लिए बदल गया है: developer.apple.com/library/ios/documentation/Swift/Conceptual/… वास्तव में, classकीवर्ड का उपयोग अब केवल गणना की गई संपत्तियों के लिए किया जा सकता है और स्थैतिक सभी प्रकार की संपत्तियों के लिए हैं (enum, class में) या संरचना)
विंसेंट सलुज़ो

@ क्रिस्विंदर जैसा कि मैंने अपने उत्तर में उल्लेख किया है, सच्चे वर्ग चर उपवर्गों द्वारा विरासत में प्राप्त किए जा सकते हैं। स्थैतिक चर नहीं कर सकते।
बिल

@VincentSaluzzo क्या Apple अपने दस्तावेज़ को अद्यतन करता है? डेवलपर .apple.com/library/ios/documentation/Swift/Conceptual/… चौथा पैराग्राफ देखें: "मान प्रकार (यानी, संरचनाएं और गणना) के लिए, आप संग्रहीत और गणना प्रकार गुणों को परिभाषित कर सकते हैं। कक्षाओं के लिए, आप कर सकते हैं। केवल गणना प्रकार के गुणों को परिभाषित करें। "
fujianjin6471

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 }
  }
}

SomeClass.workaroundClassVariable कंप्यूटेड प्रकार की संपत्ति का उपयोग तब किया जा सकता है जैसे कि यह एक संग्रहीत प्रकार की संपत्ति थी।


1
मेरे लिए काम किया - सिवाय इसके कि मुझे 'जनता' को छोड़ना पड़ा क्योंकि XCode 6.0 मुझे एक आंतरिक वर्ग के भीतर एक सार्वजनिक वर्ग की घोषणा करना पसंद नहीं था।
अली बीडल

महान काम करता है, सिवाय इसके कि एक्सकोड एक सामान्य प्रकार में नेस्टेड प्रकार की अनुमति नहीं देता है ... इसलिए यदि आपके पास एक सामान्य वर्ग है, तो यह आशाहीन लगता है क्योंकि केवल गणना किए गए गुण संभव हैं।
बेनएमक्यू

19

ऐसा लगता है कि फ़ाइल स्कोप में स्थिर भंडारण अवधि के साथ चर घोषित करना संभव है (जैसा कि C में है):

var sharedInstance: SplitViewController? = nil

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

mmmh, क्यों नहीं, लेकिन फ़ाइल स्कोप पर एक var को परिभाषित करना लंबे समय के उपयोग में मेमोरी लीक नहीं करता है?
विंसेंट सलुजो

@VincentSaluzzo स्विफ्ट से पहले आपने क्या किया, इससे कोई अंतर नहीं है: एक स्थिर चर में एकमात्र उदाहरण स्टोर करें। यहां कुछ भी लीक होने की बात नहीं है, सिवाय एक उदाहरण के जो प्रक्रिया के रूप में लंबे समय तक रहता है।
निकोलाई रुहे

मैंने अपनी कक्षा के साथ खेल के मैदान में यह कोशिश की। यह काम नहीं करता है क्योंकि जब आपने "स्टैटिक" वर्जन इनिशियलाइज़ किया है तो क्लास को अभी तक घोषित नहीं किया गया है। मैंने इसे Xcode प्रोजेक्ट में आज़माया नहीं है (मुझे लगता है कि यह वहाँ काम किया होगा?)। इसलिए मुझे "क्लास फॉरवर्ड डिक्लेरेशन" का पता लगाने की आवश्यकता हो सकती है, जैसे आप हमेशा किसी क्लास के लिए प्रोटोकॉल निर्दिष्ट करते समय करते हैं।
kawingkelvin

2
ध्यान दें कि Xcode 6.0 में, आपके पास एक ही नाम के साथ दो फ़ाइल स्कोप वैरिएबल नहीं हो सकते, भले ही वे हों private
nschum

@NikolayTsenkov बिल्कुल।
निकोलाई रुहे

14

मेरा पसंदीदा तरीका सिर्फ कक्षा के बाहर एक निजी फ़ाइल स्कोप संस्करण का उपयोग करना है और फिर क्लास / स्टैटिक गेटर्स और सेटर को लागू करना है:

private var _classVar: Int = 0;

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

5

स्विफ्ट 1.2 (Xcode 6.3b1 और उसके बाद के साथ उपलब्ध) के रूप में, staticवर्ग गुणों और विधियों का समर्थन किया जाता है।

class SomeClass
{
    static var someVariable: Int = 0
}

1
क्या आपने पकड़ लिया अगर वे सिर्फ classचर को हटाते हैं, या कोई भेद है (इसका उपयोग कक्षाओं के staticलिए किया जाता है class)?
क्रिस कॉनर

@chrisco रिलीज़ नोट बताता है कि इसके staticलिए एक उपनाम है class final
एंड्रियास ले


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जरूरत पड़ने पर पुनः प्राप्त करने के लिए एक केंद्रीय स्थान प्रदान करेगा ।


नहीं क्योंकि मेरे मामले में, स्प्लिट व्यू कॉन्ट्रोलर स्टोरीबोर्ड से जागने पर रनटाइम द्वारा initizalize था, इसलिए मैं सीधे अपने एप्लिकेशन प्रतिनिधि से इस दृश्य नियंत्रक तक नहीं पहुंच सकता हूं
विन्सेन्ट सलुजो

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

इसे इस्तेमाल करे:

class var instance: SplitViewController {
    return nil
}

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/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID254

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.