स्विफ्ट में? गेट ’और 'सेट’ क्या हैं?


102

मैं स्विफ्ट सीख रहा हूँ और मैं The Swift Programming LanguageApple से पढ़ रहा हूँ , मेरा कोई ऑब्जेक्टिव C बैकग्राउंड नहीं है (केवल PHP, JS और अन्य, लेकिन कोई Obj C नहीं है)

पृष्ठ २४-२५ पर मैं यह कोड देखता हूं:

//...Class definition stuff...

var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
}

//...Class continues...

इस भाग को पुस्तक में निर्दिष्ट नहीं किया गया है और मुझे वे नहीं मिल सकते जो इसके लिए हैं।

क्या कोई मुझे समझा सकता है कि क्या मिलता है और सेट होता है ?


2
क्या आपने गेट 21 को गेट्टर / सेटर के बारे में पढ़ा। इसके अलावा, पहले 30 पीजी या तो स्विफ्ट का दौरा है और पूर्ण प्रलेखन नहीं है।
Vol7ron

यदि आपने C ++ किया है, तो आप इस सामान को क्लास के
गेट्टर

जवाबों:


38

यह वास्तव में कोड से ठीक पहले समझाया गया है:

संग्रहीत किए जाने वाले सरल गुणों के अतिरिक्त, गुणों में एक गेट्टर और एक सेटर हो सकता है।

class EquilateralTriangle: NamedShape {
    ...

जब कोई अन्य वर्ग उस परिधि चर को प्राप्त करना चाहता है, तो वे ऐसा करते हैं:

let someVar = myTriangle.perimeter

... यह कौन कहता है:

get{
    return 3.0 * self.sideLength
}

और इस तरह यह अनिवार्य रूप से है यदि कॉलिंग कंट्रोलर ने ऐसा किया है:

let someVar = 3.0 * myTriangle.sideLength

जब आप किसी अन्य ऑब्जेक्ट से चर सेट करते हैं, तो यह इस तरह दिखता है:

myTriangle.perimeter = 100

जो set{}ब्लॉक में कोड को आमंत्रित करता है :

set {
    sideLength = newValue / 3.0
}

और इसलिए यह वैसा ही है जैसे कि वैरिएबल सेट करने वाले वर्ग ने ऐसा किया हो:

myTriangle.sideLength = 100/3.0

यह वास्तव में सिर्फ सुविधा के लिए है - आप इसे अन्य कोड से कॉल कर सकते हैं और इसे हर समय 3 से विभाजित या गुणा कर सकते हैं, क्योंकि यह चर सेट करने से ठीक पहले और चर मिलने से ठीक पहले किया गया है।

स्विफ्ट में, हमारे पास ऐसे गुण हो सकते हैं जो मिल जाने पर गणना की जाती है और सेट होने पर कुछ कर सकते हैं। हम उद्देश्य-सी में भी ऐसा कर सकते हैं:

// .h
@property (nonatomic) double perimeter;

//.m

- (double)perimeter
{
    return self.sideLength * 3.0;
}
- (void)setPerimeter:(double)perimeter
{
    self.perimeter = perimeter; // In Swift, this is done automatically.
    self.sideLength = perimeter / 3.0;
}

108

कक्षाओं के भीतर चर प्राप्त करना और स्थापित करना या तो उनकी सामग्री को पुनः प्राप्त करना ("प्राप्त करना") या परिवर्तन ("सेटिंग") को संदर्भित करता है।

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

तो आप शायद membersचर को इस तरह परिभाषित करके आगे बढ़ेंगे :

class family {
   var members:Int
}

यह, हालांकि, इस वर्ग का उपयोग करने वाले लोगों को परिवार के सदस्यों की संख्या 0 या 1. जैसी किसी चीज़ पर सेट करने की संभावना देगा और चूंकि 1 या 0 के परिवार जैसी कोई चीज नहीं है, यह काफी दुर्भाग्यपूर्ण है।

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

हमारे परिवार के वर्ग में लौटते हुए, आइए सुनिश्चित करें कि कोई membersभी 2 से कम मूल्य का मूल्य निर्धारित नहीं कर सकता है :

class family {
  var _members:Int = 2
  var members:Int {
   get {
     return _members
   }
   set (newVal) {
     if newVal >= 2 {
       _members = newVal
     } else {
       println('error: cannot have family with less than 2 members')
     }
   }
  }
}

अब हम membersपहले की तरह चर का उपयोग कर सकते हैं instanceOfFamily.members, और सेटर फ़ंक्शन के लिए धन्यवाद, हम इसे पहले से मानकर सेट कर सकते हैं, उदाहरण के लिए instanceOfFamily.members = 3:। हालाँकि, जो बदलाव आया है, वह तथ्य यह है कि हम इस चर को 2 से छोटे किसी भी चीज़ में सेट नहीं कर सकते हैं।

_membersचर के परिचय पर ध्यान दें , जो कि membersसेटर फ़ंक्शन के माध्यम से निर्धारित मान को संग्रहीत करने के लिए वास्तविक चर है । मूल membersअब एक कम्प्यूटेड संपत्ति बन गया है, जिसका अर्थ है कि यह केवल हमारे वास्तविक चर से निपटने के लिए एक इंटरफ़ेस के रूप में कार्य करता है।


members==> count, numberOfMembers; var members : Set<Person>??
गोजोनर

1
set (newVal) { ... }, newVal निहित है, इसलिए set { _members = newVal }सही भी है।
एंड्रियाशेसिंग

4
ध्यान दें कि वैरिएबल जैसे _membersनिजी होना चाहिए, अन्यथा कमांड 2 से नीचे मान पर instanceOfFamily._members=1सेट होगाinstanceOfFamily.members
डैनियल

ऐसा लगता है कि डिफ़ॉल्ट पैरामीटर का नाम newValueस्विफ्ट 4 में है - docs.swift.org/swift-book/LanguageGuide/Properties.html#ID260
Nolan Amy

19

एक सरल प्रश्न का संक्षिप्त, सरल और स्पष्ट उत्तर दिया जाना चाहिए।

  • जब हम उस संपत्ति का मूल्य प्राप्त कर रहे होते हैं जो उसके get{}हिस्से को आग लगा देती है ।

  • जब हम उस संपत्ति के लिए एक मूल्य निर्धारित कर रहे हैं जो उसके set{}हिस्से को आग लगाती है ।

पुनश्च। संपत्ति के लिए एक मूल्य निर्धारित करते समय, SWIFT स्वचालित रूप से "newValue" = एक मान बनाता है जिसे हम सेट कर रहे हैं। एक निरंतर "न्यूवैल्यू" के बाद संपत्ति के set{}हिस्से में सुलभ हो जाता है ।

उदाहरण:

var A:Int = 0
var B:Int = 0

var C:Int {
get {return 1}
set {print("Recived new value", newValue, " and stored into 'B' ")
     B = newValue
     }
}

//When we are getting a value of C it fires get{} part of C property
A = C 
A            //Now A = 1

//When we are setting a value to C it fires set{} part of C property
C = 2
B            //Now B = 2

1
क्या सदस्य को कक्षा के बाहर से एक्सेस करने के लिए डिफ़ॉल्ट मान निर्दिष्ट करना अनिवार्य है। जब मुझे इसके लिए डिफ़ॉल्ट मान असाइन किया गया था, तो मुझे यह समस्या आई। UserBean: NSObject {var user_id: स्ट्रिंग? = nil} इसे निम्नलिखित उपयोगकर्ता की तरह एक्सेस कर रहा है: UserBean = UserBean () user.user_id = "23232332"
अमृत ​​गुस्सा

2

आपको कम्प्यूटेड प्रॉपर्टीज को देखना चाहिए

आपके कोड नमूने में, perimeterएक संपत्ति एक वर्ग चर द्वारा समर्थित नहीं है, इसके बजाय इसका मूल्य getविधि का उपयोग करके गणना की जाती है और विधि के माध्यम से संग्रहीत किया setजाता है - आमतौर पर गेट्टर और सेटर के रूप में संदर्भित किया जाता है ।

जब आप इस तरह से उस संपत्ति का उपयोग करते हैं:

var cp = myClass.perimeter

आप getकोड ब्लॉक में निहित कोड को लागू कर रहे हैं , और जब आप इसे इस तरह से उपयोग करते हैं:

myClass.perimeter = 5.0

आप setकोड ब्लॉक में निहित कोड को लागू कर रहे हैं , जहां newValueअसाइनमेंट ऑपरेटर के दाईं ओर दिए गए मूल्य के साथ स्वचालित रूप से भरा हुआ है।

यदि एक गटर और एक सेटर दोनों निर्दिष्ट किए जाते हैं, या केवल गाइटर निर्दिष्ट किए जाने पर आसानी से पढ़े जा सकते हैं, तो गणना किए गए गुणों को फिर से लिखा जा सकता है।


0

वैरिएबल घोषित करता है और एक कक्षा में इस तरह कॉल करता है

class X {
    var x: Int = 3

}
var y = X()
print("value of x is: ", y.x)

//value of x is:  3

अब आप x का डिफ़ॉल्ट मान 3 से अधिक या उसके बराबर करने के लिए प्रोग्राम करना चाहते हैं। अब काल्पनिक मामले को लें यदि x 3 से कम है, तो आपका प्रोग्राम विफल हो जाएगा। इसलिए, आप चाहते हैं कि लोग 3 या अधिक से अधिक 3 लगा दें। स्विफ्ट आपके लिए आसान हो गया और चर मूल्य को डेटिंग करने के इस बिट-एडवांस तरीके को समझना महत्वपूर्ण है क्योंकि वे बड़े पैमाने पर आईओएस विकास में उपयोग करेंगे। अब देखते हैं कि कैसे सेट और सेट का उपयोग यहां किया जाएगा।

class X {
    var _x: Int = 3
    var x: Int {
        get {
            return _x
        }
        set(newVal) {  //set always take 1 argument
            if newVal >= 3 {
             _x = newVal //updating _x with the input value by the user
            print("new value is: ", _x)
            }
            else {
                print("error must be greater than 3")
            }
        }
    }
}
let y = X()
y.x = 1
print(y.x) //error must be greater than 3
y.x = 8 // //new value is: 8

यदि आपको अभी भी संदेह है, तो बस याद रखें, गेट और सेट का उपयोग किसी भी चर को अपडेट करने के लिए है जिस तरह से हम इसे अपडेट करना चाहते हैं। प्राप्त करें और सेट करें इससे आपको अपने तर्क पर शासन करने के लिए बेहतर नियंत्रण मिलेगा। शक्तिशाली उपकरण इसलिए आसानी से समझ में नहीं आता है।

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