स्विफ्ट भाषा में विस्मयादिबोधक चिह्न का क्या अर्थ है?


518

स्विफ्ट प्रोग्रामिंग भाषा गाइड के निम्नलिखित उदाहरण हैं:

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { println("\(name) is being deinitialized") }
}

class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    var tenant: Person?
    deinit { println("Apartment #\(number) is being deinitialized") }
}

var john: Person?
var number73: Apartment?

john = Person(name: "John Appleseed")
number73 = Apartment(number: 73)

//From Apple's “The Swift Programming Language” guide (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)

फिर जब व्यक्ति को अपार्टमेंट सौंपते हैं, तो वे "उदाहरण को खोलना" के लिए एक विस्मयादिबोधक बिंदु का उपयोग करते हैं।

john!.apartment = number73

"उदाहरण को खोलना" का क्या अर्थ है? क्यों जरूरी है? यह केवल निम्नलिखित कार्य करने से अलग कैसे है:

john.apartment = number73

मैं स्विफ्ट भाषा के लिए बहुत नया हूं। बस मूल बातें नीचे लाने की कोशिश कर रहा है।


अद्यतन:
पहेली का बड़ा टुकड़ा जो मुझे याद आ रहा था (सीधे जवाब में नहीं कहा गया है - कम से कम यह लिखने के समय नहीं) यह है कि जब आप निम्न कार्य करते हैं:

var john: Person?

इसका मतलब यह नहीं है कि " johnप्रकार का है Personऔर यह शून्य हो सकता है", जैसा कि मैंने मूल रूप से सोचा था। मैं बस गलतफहमी थी कि Personऔर Person?पूरी तरह से अलग प्रकार के हैं। एक बार जब मैं समझ गया कि, बाकी सब ?, !पागलपन, और नीचे दिए गए शानदार जवाबों ने और भी बहुत कुछ किया है।

जवाबों:


530

"उदाहरण को खोलना" का क्या अर्थ है? क्यों जरूरी है?

जहां तक ​​मैं काम कर सकता हूं (यह मेरे लिए बहुत नया है, भी) ...

शब्द "लिपटे" का तात्पर्य है कि हमें एक वैकल्पिक चर को वर्तमान के रूप में सोचना चाहिए , जो चमकदार कागज में लिपटा हो, जो (दुखद!) खाली हो सकता है

जब "लिपटे", एक वैकल्पिक चर का मान दो संभावित मानों (एक बूलियन की तरह थोड़ा) के साथ एक एनम है। यह एनम वर्णन करता है कि क्या चर एक मान ( Some(T)), या नहीं ( None) रखता है ।

यदि कोई मान है, तो यह चर को "अलिखित" (प्राप्त करने Tसे Some(T)) प्राप्त किया जा सकता है ।

कैसे john!.apartment = number73अलग है john.apartment = number73? (भावानूदित)

यदि आप एक वैकल्पिक चर का नाम लिखते हैं (जैसे पाठ john, बिना !), तो यह "लिपटे" एनम (कुछ / कोई नहीं) को संदर्भित करता है, न कि मूल्य (टी) को। तो johnइसका उदाहरण नहीं है Person, और इसमें कोई apartmentसदस्य नहीं है :

john.apartment
// 'Person?' does not have a member named 'apartment'

वास्तविक Personमूल्य को विभिन्न तरीकों से अलिखित किया जा सकता है:

  • "जबरन छूटना": john!( Personअगर यह मौजूद है तो मान देता है, रनटाइम त्रुटि अगर यह शून्य है)
  • "वैकल्पिक बाध्यकारी": if let p = john { println(p) }( printlnयदि मान मौजूद है तो निष्पादित होता है)
  • "वैकल्पिक श्रृंखलन": john?.learnAboutSwift()(यदि मूल्य मौजूद है तो यह बना-बनाया तरीका निष्पादित करता है)

मुझे लगता है कि आप इन मामलों में से एक को खोलना चुनते हैं, जो इस बात पर निर्भर करता है कि नील मामले में क्या होना चाहिए, और यह कैसे संभव है। यह भाषा डिज़ाइन शून्य मामले को स्पष्ट रूप से नियंत्रित करने के लिए मजबूर करती है, जो मुझे लगता है कि ओबज-सी पर सुरक्षा में सुधार होता है (जहां यह शून्य मामले को संभालने के लिए भूलना आसान है)।

अपडेट :

विस्मयादिबोधक चिह्न का उपयोग वाक्यविन्यास में "अस्पष्ट रूप से अनचाहे वैकल्पिक" घोषित करने के लिए भी किया जाता है।

अब तक के उदाहरणों में, johnचर के रूप में घोषित किया गया है var john:Person?, और यह एक वैकल्पिक है। यदि आप उस चर का वास्तविक मूल्य चाहते हैं, तो आपको इसे तीन तरीकों में से एक का उपयोग करके इसे खोल देना चाहिए।

यदि इसे var john:Person!इसके बजाय घोषित किया गया था, तो चर इंप्लांटली अनवेरैप्ड ऑप्शनल होगा (ऐप्पल बुक में इस शीर्षक के साथ अनुभाग देखें)। मूल्य तक पहुंचते समय इस तरह के चर को खोलना नहीं है, और johnइसका उपयोग अतिरिक्त सिंटैक्स के बिना किया जा सकता है। लेकिन एप्पल की पुस्तक कहती है:

जब एक चर बाद के बिंदु पर शून्य हो जाने की संभावना हो, तो अवैध रूप से अलिखित वैकल्पिक का उपयोग नहीं किया जाना चाहिए। यदि आप एक चर के जीवनकाल के दौरान शून्य मान की जांच करने की आवश्यकता है, तो हमेशा एक सामान्य वैकल्पिक प्रकार का उपयोग करें।

अपडेट 2 :

माइक ऐश द्वारा " रोचक स्विफ्ट सुविधाएँ " लेख वैकल्पिक प्रकारों के लिए कुछ प्रेरणा देता है। मुझे लगता है कि यह महान, स्पष्ट लेखन है।

अपडेट 3 :

विस्मयादिबोधक चिह्न के लिए अंतर्निहित अलिखित वैकल्पिक उपयोग के बारे में एक और उपयोगी लेख : क्रिस एडम्सन द्वारा " स्विफ्ट एंड द लास्ट माइल "। लेख बताता है कि यह ऐप्पल द्वारा एक व्यावहारिक उपाय है जिसका उपयोग उनके उद्देश्य-सी फ्रेमवर्क द्वारा उपयोग किए जाने वाले प्रकारों को घोषित करने के लिए किया जाता है जिसमें शून्य हो सकते हैं। एक प्रकार को वैकल्पिक के रूप में घोषित करना (उपयोग करना ?) या अंतर्निहित रूप से अपरिवर्तित (उपयोग करना !) "सुरक्षा और सुविधा के बीच एक व्यापार है"। लेख में दिए गए उदाहरणों में, Apple ने प्रकारों को स्पष्ट रूप से अपरिवर्तित घोषित करने के लिए चुना है, जिससे कॉलिंग कोड अधिक सुविधाजनक हो जाता है, लेकिन कम सुरक्षित है।

शायद Apple भविष्य में अपने फ्रेमवर्क के माध्यम से कंघी कर सकता है, जो कि अव्यवस्थित रूप से अपरिवर्तित ("शायद कभी नहीं") मापदंडों की अनिश्चितता को दूर करता है और उन्हें वैकल्पिक के साथ बदल देता है ("निश्चित रूप से विशेष रूप से शून्य हो सकता है [उम्मीद है, प्रलेखित!] परिस्थितियों) या मानक गैर! -उपयोगात्मक ("कभी शून्य नहीं है") घोषणाएं, उनके उद्देश्य-सी कोड के सटीक व्यवहार पर आधारित हैं।


मैं इस स्पष्टीकरण के बारे में निश्चित नहीं हूं। यदि आप सिर्फ बिना कोड चलाते हैं! यह अभी भी वास्तविक मूल्य लौटाता है। हो सकता है ! गति के लिए है?
रिचर्ड वाशिंगटन

ठीक। तो डॉक्स का उपयोग करने के बारे में बात करते हैं! जब आप यह सुनिश्चित करने के लिए जानते हैं कि यह अपरिवर्तित हो सकता है। लेकिन आप इसके बिना कोड को ठीक से चला सकते हैं (आपकी सूची के लिए एक अगला विकल्प - निहितार्थ को उजागर करना) और पहले जाँच के बिना। आप मान वापस प्राप्त करते हैं या शून्य करते हैं। लेकिन अगर आप यह सुनिश्चित करने के लिए जानते हैं कि यह शून्य नहीं है तो उपयोग करें! ...... लेकिन मैं अभी भी यह नहीं देख सकता कि आप ऐसा क्यों करेंगे?
रिचर्ड वाशिंगटन

2
Hi @RichardWashington - मैंने अपने जवाब में एक अपडेट जोड़ा है जो उम्मीद करता है कि इसमें से कुछ स्पष्ट हो।
एशले

अपडेट 3 वास्तव में वही है जिसकी मुझे तलाश है। पढ़ने से पहले मुझे लगा कि Apple झूठ बोल रहा था जब वे NSURLCredential की तरह लौट आए! जो वास्तव में शून्य हो सकता है।
गोल्डन थम्ब

शानदार जवाब @Ashley के लिए धन्यवाद। इस उत्तर और एप्पल के कुछ उदाहरण स्विफ्ट कोड को पढ़ने के बाद, यह वास्तव में मुझे लगता है कि सुरक्षा और उत्पादकता के बीच इस व्यापार में, आमतौर पर यह सुरक्षित पक्ष पर होना सबसे अच्छा है। एक उल्लेखनीय अपवाद मैंने पाया है जब Apple यूआई तत्वों के लिए मजबूर अलिखित का उपयोग करता है, जो समझ में आता है क्योंकि पहले, यूआई तत्व स्टोरीबोर्ड को शामिल करते समय आमतौर पर वैकल्पिक होते हैं (जैसा कि उन्हें प्रोग्रामेटिक रूप से कोई मान असाइन नहीं किया गया है), और दूसरा क्योंकि वे लगभग हैं। कभी भी शून्य न करें जब तक कि उनका व्यू कंट्रोलर शून्य न हो, जिस स्थिति में यह चर्चा होती है यदि मूट।
मिहिर

127

यहाँ मुझे लगता है कि अंतर है:

var john: Person?

मतलब जोह शून्य हो सकता है

john?.apartment = number73

कंपाइलर इस लाइन की व्याख्या करेगा:

if john != nil {
    john.apartment = number73
}

जबकि

john!.apartment = number73

कंपाइलर इस लाइन की व्याख्या इस प्रकार करेगा:

john.apartment = number73

इसलिए, का उपयोग कर! यदि कथन को अनकैप किया जाएगा, और इसे तेज़ी से चलाया जाएगा, लेकिन यदि जॉन शून्य है, तो रनटाइम त्रुटि होगी।

तो यहां रैप का मतलब यह नहीं है कि यह मेमोरी रैप है, लेकिन इसका मतलब है कि यह कोड लिपटे हुए हैं, इस मामले में यह एक इफ स्टेटमेंट के साथ लिपटे हुए है, और क्योंकि Apple रनटाइम में प्रदर्शन पर पूरा ध्यान देते हैं, वे आपको एक रास्ता देना चाहते हैं। अपने ऐप को सर्वश्रेष्ठ संभव प्रदर्शन के साथ चलाएं।

अपडेट करें:

4 वर्षों के बाद इस उत्तर पर वापस जाना, जैसा कि मुझे स्टैकओवरफ़्लो में इसकी सबसे अधिक प्रतिष्ठा मिली :) मुझे उस समय अलिखित शब्द का अर्थ थोड़ा गलत लगा। अब 4 वर्षों के बाद मेरा मानना ​​है कि यहां अपरिवर्तन का अर्थ अपने मूल कॉम्पैक्ट रूप से कोड का विस्तार करना है। इसके अलावा इसका मतलब उस वस्तु के आस-पास की अस्पष्टता को दूर करना है, क्योंकि हम निश्चित नहीं हैं कि इसकी परिभाषा शून्य है या नहीं। ऊपर एशले के जवाब की तरह, इसके बारे में एक वर्तमान के रूप में सोचें, जिसमें कुछ भी नहीं हो सकता है। लेकिन मुझे अभी भी लगता है कि अल्ट्रॉप कोड कोडिंग है और एनम का उपयोग करते हुए मेमोरी आधारित अल्ट्रैपिंग नहीं है।


9
मेरे खेल का मैदान john.apartment = number73 संकलन नहीं है, आप जॉन .apartment = number73 निर्दिष्ट करना होगा?
चक Pinkert

2
@ChuckPinkert सही है, 4 वीं पंक्ति को जॉन को संपादित किया जाना चाहिए? बॉक्स = संख्या 73, हालांकि अच्छा जवाब!
ब्रूस

john.apbox = number73 त्रुटि देता है: वैकल्पिक प्रकार का मूल्य 'व्यक्ति?' अलिखित नहीं: क्या आप का उपयोग करने का मतलब था '!' या '?'
स्पाइडरमैन

4
अलिखित प्रदर्शन के लिए कुछ भी नहीं करना है। "निल चेक" को अभी भी रनटाइम पर किया जाना है, एकमात्र अंतर यह है कि रनटाइम एरर wil को फेंका जा सकता है यदि कोई मूल्य वैकल्पिक में मौजूद नहीं है।
मदीदिर

67

टी एल; डॉ

स्विफ्ट भाषा में विस्मयादिबोधक चिह्न का क्या अर्थ है?

विस्मयादिबोधक चिह्न प्रभावी रूप से कहता है, “मुझे पता है कि इस विकल्प का निश्चित रूप से एक मूल्य है; कृपया इसका उपयोग करें। ” इसे वैकल्पिक मूल्य के जबरन आवरण के रूप में जाना जाता है:

उदाहरण

let possibleString: String? = "An optional string."
print(possibleString!) // requires an exclamation mark to access its value
// prints "An optional string."

let assumedString: String! = "An implicitly unwrapped optional string."
print(assumedString)  // no exclamation mark is needed to access its value
// prints "An implicitly unwrapped optional string."

स्रोत: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_399


11
आपका जवाब बहुत अच्छा है क्योंकि मैं समझता हूं कि अभी क्या चल रहा है। मुझे समझ में नहीं आता है कि अंतर्निहित अलिखित विकल्प क्यों मौजूद हैं। क्यों एक नियमित रूप से स्ट्रिंग प्रकार के बजाय एक अंतर्निहित अलिखित वैकल्पिक स्ट्रिंग के रूप में परिभाषित कुछ बनाएं? इसके बाद उनका उपयोग समान है। मैं क्या खो रहा हूँ?
पचुन

यह अब सच नहीं लगता है। एक स्विफ्ट 5 उत्तर में, अगर मैं करता हूं let f: String! = "hello"और फिर print(f), आउटपुट केवल के Optional("hello")बजाय है "hello"
नंबरमानक

37

यदि जॉन एक वैकल्पिक संस्करण था (इस प्रकार घोषित)

var john: Person?

तब जॉन के लिए यह संभव होगा कि उसका कोई मूल्य न हो (ObjC parlance, nil value में)

विस्मयादिबोधक बिंदु मूल रूप से संकलक को बताता है "मुझे पता है कि इसका एक मूल्य है, आपको इसके लिए परीक्षण करने की आवश्यकता नहीं है"। यदि आप इसका उपयोग नहीं करना चाहते हैं, तो आप इसके लिए सशर्त परीक्षण कर सकते हैं:

if let otherPerson = john {
    otherPerson.apartment = number73
}

इस के इंटीरियर का मूल्यांकन केवल तभी होगा जब जॉन के पास कोई मूल्य हो।


4
प्रतिक्रिया के लिए धन्यवाद, अब मैं समझ क्या विस्मयादिबोधक चिह्न का कहना है, मैं अभी भी चारों ओर मेरे सिर लपेटो करने कोशिश कर रहा हूँ क्यों ... आप ने कहा कि यह संकलक "मुझे पता है यह एक मूल्य है, आप के लिए परीक्षण की जरूरत नहीं है बताता है यह "। जब कंपाइलर इसके लिए परीक्षण नहीं करता है तो यह मुझे क्या खरीदता है? विस्मयादिबोधक बिंदु के बिना, संकलक एक त्रुटि फेंकने वाला है (मेरे पास एक वातावरण नहीं है, फिर भी, जहां मैं स्विफ्ट का परीक्षण कर सकता हूं)? है ! सभी वैकल्पिक var के लिए 100% आवश्यक है? यदि हां, तो क्यों एप्पल इसके साथ, के रूप में सिर्फ इसलिए यह बनाने के लिए विरोध किया परेशान था कमी की! इसका मतलब है "मुझे पता है कि इसका एक मूल्य है, आपको इसके लिए परीक्षण करने की आवश्यकता नहीं है"?
ट्रॉय

"संकलक एक त्रुटि फेंकने जा रहा है" - नहीं, यह अभी भी ठीक काम करता है जैसा कि उम्मीद थी। मुझे यह नहीं मिलता। है ! गति के लिए बस जब आप निश्चित रूप से हो सकता है?
रिचर्ड वाशिंगटन

वास्तव में बाद में डॉक्स में नीचे दिए गए उदाहरण का उपयोग करते हुए अंतर्निहित अलिखित वैकल्पिक के बारे में बात की गई है: “let possibleString: String? = "An optional string." println(possibleString!) // requires an exclamation mark to access its value // prints "An optional string.” लेकिन यह नहीं के साथ ठीक काम करता है। यहां कुछ अजीब लगता है।
रिचर्ड वाशिंगटन

3
@RichardWashington आप अच्छे कारण के लिए उलझन में हैं! डॉक्स में उदाहरण कुछ चीजों को छोड़ रहे हैं, और भ्रामक हैं क्योंकि वे जो भी करते हैं वह प्रिंटलाइन का उपयोग करता है। जाहिरा तौर पर, ऐसे कम से कम दो उदाहरण हैं जहां वैकल्पिकों को खोलना आवश्यक नहीं है। एक जब println का उपयोग कर रहा है। एक और जब स्ट्रिंग प्रक्षेप का उपयोग कर रहा है। तो, हो सकता है कि println और स्ट्रिंग इंटरपोलेशन कवर के तहत अलिखित हों? शायद किसी को इस पर अधिक जानकारी है। Xcode6 बीटा हेडर परिभाषाओं को देखकर मुझे इस जादू के बारे में कुछ भी पता नहीं चला।
जुबानी

हां, मुझे वह मिलता है John?और Johnदो अलग-अलग प्रकार के होते हैं। एक प्रकार ऑप्शनल पर्सन का होता है और दूसरा टाइप पर्सन। इससे पहले कि आप व्यक्ति को बाहर निकाल सकें, वैकल्पिक व्यक्ति को अलिखित करने की आवश्यकता है। लेकिन जैसा कि आप कहते हैं, ऐसा लगता है कि इन परिस्थितियों में कम से कम वास्तव में कुछ भी किए बिना ऐसा होता है। यह बनाने लगता है! अनावश्यक। जब तक कि ! संकलित समय त्रुटियों को पकड़ने के लिए हमेशा वैकल्पिक लेकिन एक सुझाई गई बात है। एक विशेष प्रकार के वेरिएंट / लेट्स को असाइन करने की तरह स्पष्ट किया जा सकता है, let John: Person = ...लेकिन इसका अनुमान भी लगाया जा सकता है let John = ...
रिचर्ड वाशिंगटन

27

अन्य उपयोगी लेकिन अधिक विवरण-केंद्रित उत्तर में जोड़ने के लिए कुछ बड़े चित्र परिप्रेक्ष्य:

स्विफ्ट में, विस्मयादिबोधक बिंदु कई संदर्भों में प्रकट होता है:

  • जबरन गिरवी रखना: let name = nameLabel!.text
  • वैकल्पिक रूप से अपरिवर्तित वैकल्पिक: var logo: UIImageView!
  • जबरन कास्टिंग: logo.image = thing as! UIImage
  • बिना किसी अपवाद के: try! NSJSONSerialization.JSONObjectWithData(data, [])

इनमें से हर एक एक अलग अर्थ के साथ एक अलग भाषा का निर्माण है, लेकिन वे सभी तीन महत्वपूर्ण चीजें हैं:

1. विस्मयादिबोधक बिंदु स्विफ्ट के संकलन-समय सुरक्षा जांच को रोकते हैं।

जब आप !स्विफ्ट में उपयोग करते हैं, तो आप अनिवार्य रूप से कह रहे हैं, "अरे, संकलक, मुझे पता है कि आपको लगता है कि यहां एक त्रुटि हो सकती है, लेकिन मैं पूरी निश्चितता के साथ जानता हूं कि यह कभी नहीं होगा।"

सभी मान्य कोड स्विफ्ट के संकलन-समय प्रकार प्रणाली के बॉक्स में फिट नहीं होते हैं - या किसी भी भाषा के स्थिर प्रकार की जाँच, उस मामले के लिए। ऐसी स्थितियां हैं जहां आप तार्किक रूप से साबित कर सकते हैं कि कोई त्रुटि कभी नहीं होगी, लेकिन आप इसे संकलक के लिए साबित नहीं कर सकते । यही कारण है कि स्विफ्ट के डिजाइनरों ने इन सुविधाओं को पहले स्थान पर जोड़ा।

हालाँकि, जब भी आप उपयोग करते हैं !, आप एक त्रुटि के लिए रिकवरी पथ होने का निर्णय ले रहे हैं, जिसका अर्थ है कि…

2. विस्मय बोधक बिंदु संभावित क्रैश हैं।

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

यह एक खतरनाक दावा है। यह सही हो सकता है: मिशन-क्रिटिकल कोड में जहां आपने अपने कोड के इनवेरिएंट के बारे में कठिन सोचा है, यह हो सकता है कि फर्जी आउटपुट क्रैश से भी बदतर है।

हालांकि, जब मैं !जंगली में देखता हूं, तो यह शायद ही कभी दिमाग से उपयोग किया जाता है। इसके बजाय, इसका अक्सर अर्थ होता है, "यह मूल्य वैकल्पिक था और मैंने वास्तव में बहुत कठिन नहीं सोचा था कि यह शून्य क्यों हो सकता है या उस स्थिति को ठीक से कैसे संभाल सकता है, लेकिन !इसे संकलित किया गया ... इसलिए मेरा कोड सही है, है ना?"

विस्मयादिबोधक बिंदु के अहंकार से सावधान रहें। बजाय…

3. विस्मयादिबोधक बिंदु का सबसे अच्छा इस्तेमाल किया जाता है।

इनमें से हर एक !निर्माण में एक ?प्रतिपक्ष होता है जो आपको त्रुटि / शून्य मामले से निपटने के लिए मजबूर करता है:

  • सशर्त अलौकिक: if let name = nameLabel?.text { ... }
  • optionals: var logo: UIImageView?
  • सशर्त जातियां: logo.image = thing as? UIImage
  • निल-ऑन-फेल अपवाद: try? NSJSONSerialization.JSONObjectWithData(data, [])

यदि आप उपयोग करने के लिए ललचाते हैं !, तो हमेशा ध्यान से विचार करना अच्छा है कि आप ?इसके बजाय उपयोग क्यों नहीं कर रहे हैं । यदि !ऑपरेशन विफल हो जाता है तो क्या वास्तव में आपके प्रोग्राम को सबसे अच्छा विकल्प है? वह मूल्य वैकल्पिक / उपलब्ध क्यों नहीं है?

क्या एक उचित पुनर्प्राप्ति पथ आपके कोड को शून्य / त्रुटि मामले में ले सकता है? यदि हां, तो इसे कोड करें।

यदि यह संभवतः शून्य नहीं हो सकता है, यदि त्रुटि कभी नहीं हो सकती है, तो क्या आपके तर्क को फिर से बनाने का एक उचित तरीका है ताकि संकलक ऐसा हो? यदि ऐसा है, तो करें; आपका कोड कम त्रुटि वाला होगा।

ऐसे समय होते हैं जब किसी त्रुटि को संभालने का कोई उचित तरीका नहीं होता है, और बस त्रुटि को अनदेखा कर देता है - और इस प्रकार गलत डेटा के साथ आगे बढ़ना - दुर्घटनाग्रस्त होने से भी बदतर होगा । वे समय बल प्रयोग का समय है।

मैं समय-समय पर इसके संपूर्ण !उपयोग के लिए अपना पूरा कोडबेस खोजता हूं और ऑडिट करता हूं । बहुत कम उपयोग करने वाले लोग जांच के लिए खड़े होते हैं। (इस लेखन के रूप में, पूरे Siesta ढांचे के इसके दो उदाहरण हैं।)

यह कहने के लिए नहीं है कि आपको अपने कोड में कभी भी उपयोग नहीं करना चाहिए !- बस यह कि आप इसे सावधानी से उपयोग करें , और इसे कभी भी डिफ़ॉल्ट विकल्प न बनाएं।


func isSubscriptionActive(receiptData: NSDictionary?) -> Bool { if(receiptData == nil) { return false; } return (hasValidTrial(receiptData!) || isNotExpired(receiptData!)) && isNotCancelled(receiptData!) } दिए गए 3. क्या इसे लिखने का एक बेहतर तरीका है?
जेंसन-बटन-इवेंट

आप कह सकते हैंfunc isSubscriptionActive(receiptData: NSDictionary?) -> Bool { guard let nonNilReceiptData = receiptData else { return false} return (hasValidTrial(nonNilReceiptData) || isNotExpired(nonNilReceiptData)) && isNotCancelled(nonNilReceiptData) }
rkgibson2

विस्मयादिबोधक चिह्न किसी भी सुरक्षा जांच को दरकिनार नहीं करते हैं। वैकल्पिक शून्य होने पर आपको एक गारंटीकृत क्रैश मिलता है। वैकल्पिक हमेशा जाँच की जाती है। यह सुरक्षा जांच करने का एक बहुत ही क्रूर तरीका है।
gnasher729

@ gnasher729 उत्तर के रूप में, यह सुरक्षित रनटाइम विफलता के पक्ष में संकलन-समय सुरक्षा जाँच को रोकता है ।
पॉल कैंटरेल

24

johnएक वैकल्पिक है var। तो एक nilमान हो सकता है । यह सुनिश्चित करने के लिए कि मान शून्य नहीं है !, के अंत में उपयोग करेंvar नाम ।

प्रलेखन से

“एक बार जब आप सुनिश्चित हो जाते हैं कि वैकल्पिक में कोई मान है, तो आप वैकल्पिक नाम के अंत में एक विस्मयादिबोधक चिह्न (!) जोड़कर इसके अंतर्निहित मूल्य तक पहुँच सकते हैं। विस्मयादिबोधक चिह्न प्रभावी रूप से कहता है, “मुझे पता है कि इस विकल्प का निश्चित रूप से एक मूल्य है; कृपया इसका उपयोग करें। ”

गैर शून्य मान की जांच करने का दूसरा तरीका है

    if let j = json {
        // do something with j
    }

1
हां, मैंने देखा था कि प्रलेखन में, लेकिन यह अभी भी अनावश्यक लगता है ... जैसा कि, मेरे लिए john.apartment = number73भी , "मुझे पता है कि इस वैकल्पिक का निश्चित रूप से एक मूल्य है, कृपया इसका उपयोग करें।" ...
ट्रॉय

6
हाँ यह करता है, लेकिन मुद्दा यह है कि डिफ़ॉल्ट रूप से स्विफ्ट संकलन समय पर त्रुटियों को पकड़ने की कोशिश करता है। यदि आप जानते हैं या सोचते हैं कि आप जानते हैं कि इस चर में शून्य नहीं हो सकता है तो आप विस्मयादिबोधक चिह्न का उपयोग करके उस चेक को हटा सकते हैं।
लेज़ेज

16

यहाँ कुछ उदाहरण हैं:

var name:String = "Hello World"
var word:String?

wordवैकल्पिक मूल्य कहां है इसका मतलब है कि इसमें मूल्य हो सकता है या नहीं भी हो सकता है।

word = name 

यहाँ nameएक मान है इसलिए हम इसे असाइन कर सकते हैं

var cow:String = nil
var dog:String!

जहां dogबलपूर्वक अपरिवर्तित का अर्थ है कि इसमें एक मान होना चाहिए

dog = cow

एप्लिकेशन क्रैश हो जाएगा क्योंकि हम nilअलिखित किए गए हैं


1
var c:Int = nilमिलेगा: "निल निर्दिष्ट प्रकार को 'int' को इनिशियलाइज़ नहीं कर सकता है
Asususer

15

इस मामले में...

var जॉन: व्यक्ति!

इसका मतलब है, कि शुरू में जॉन के पास शून्य मूल्य होगा, इसे सेट किया जाएगा और एक बार सेट को फिर से शून्य-नेतृत्व नहीं किया जाएगा। इसलिए सुविधा के लिए मैं एक वैकल्पिक संस्करण तक पहुँचने के लिए आसान वाक्यविन्यास का उपयोग कर सकता हूं क्योंकि यह एक "Implicitly अलिखित वैकल्पिक" है


1
धन्यवाद। मैंने निम्नलिखित लिंक भी पाया जो यह बताता है। इस तरह के प्रकार को "निहित रूप से अलिखित विकल्प" कहा जाता है। stackoverflow.com/questions/24122601/…
कायडेल

5

यदि आप सी-परिवार की भाषा से आए हैं, तो आप "टाइप एक्स के ऑब्जेक्ट के लिए पॉइंटर" सोच रहे होंगे जो कि स्मृति पता 0 (NULL) हो सकता है, और यदि आप एक गतिशील रूप से टाइप की गई भाषा से आ रहे हैं, तो आप सोच "वस्तु जो शायद प्रकार एक्स की है, लेकिन अपरिभाषित प्रकार की हो सकती है"। इनमें से कोई भी वास्तव में सही नहीं है, हालांकि एक गोल चक्कर में पहले वाला करीब है।

आप जिस तरह से सोच रहे होंगे वह वैसा ही होगा जैसे कोई वस्तु हो:

struct Optional<T> {
   var isNil:Boolean
   var realObject:T
}

जब आप अपने वैकल्पिक मूल्य का परीक्षण कर रहे हैं तो foo == nilयह वास्तव में वापस आ रहा है foo.isNil, और जब आप कहते हैं कि foo!यह foo.realObjectजोर के साथ लौट रहा है foo.isNil == false। यह नोट करना महत्वपूर्ण है क्योंकि यदि fooआप करते हैं तो वास्तव में शून्य हैfoo! , यह एक रनटाइम त्रुटि है, इसलिए आमतौर पर आप इसके बजाय एक सशर्त उपयोग करना चाहते हैं जब तक कि आप यह सुनिश्चित न करें कि मूल्य शून्य नहीं होगा। इस तरह की प्रवंचना का अर्थ है कि यदि आप हर जगह मान शून्य हैं, तो आपको परीक्षण करने के लिए मजबूर किए बिना भाषा को दृढ़ता से टाइप किया जा सकता है।

व्यवहार में, यह वास्तव में ऐसा व्यवहार नहीं करता है क्योंकि काम कंपाइलर द्वारा किया जाता है। एक उच्च स्तर पर एक प्रकार Foo?होता है जो अलग होता है Foo, और यह फंक को रोकता है जो प्रकार को स्वीकार करता हैFoo एक शून्य मान प्राप्त करने से को , लेकिन निम्न स्तर पर एक वैकल्पिक मूल्य एक सच्ची वस्तु नहीं है क्योंकि इसमें कोई गुण या विधियां नहीं हैं; संभावना है कि वास्तव में यह एक पॉइंटर है जो बल-अलिखित होने पर उपयुक्त परीक्षण के साथ NULL (0) द्वारा हो सकता है।

दूसरी स्थिति जिसमें आपको एक विस्मयादिबोधक चिह्न दिखाई देगा, वह इस प्रकार है:

func foo(bar: String!) {
    print(bar)
}

यह एक मजबूर अनप्रैप के साथ एक वैकल्पिक को स्वीकार करने के बराबर है, अर्थात:

func foo(bar: String?) {
    print(bar!)
}

आप इसे एक विधि के लिए उपयोग कर सकते हैं जो तकनीकी रूप से एक वैकल्पिक मूल्य को स्वीकार करता है लेकिन शून्य होने पर रनटाइम त्रुटि होगी। स्विफ्ट के वर्तमान संस्करण में यह स्पष्ट रूप से is-not-nil मुखर को बायपास करता है इसलिए आपको इसके बजाय निम्न-स्तरीय त्रुटि होगी। आम तौर पर एक अच्छा विचार नहीं है, लेकिन किसी अन्य भाषा से कोड को परिवर्तित करते समय यह उपयोगी हो सकता है।


3

! इसका मतलब है कि आप ऑब्जेक्ट को बल से हटा रहे हैं! इस प्रकार है। अधिक जानकारी सेब के प्रलेखन में देखी जा सकती है, जो यहां पाई जा सकती है: https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/TheBasics.html


3

यदि आप C # से परिचित हैं, तो यह Nullable प्रकारों की तरह है, जिन्हें प्रश्न चिह्न का उपयोग करके भी घोषित किया जाता है:

Person? thisPerson;

और इस मामले में विस्मयादिबोधक चिह्न तक पहुँचने के बराबर है। इस प्रकार की अशक्त प्रकार की संपत्ति का पता लगाएं:

thisPerson.Value

2

ऑब्जेक्टिव C वेरिएबल्स में बिना वैल्यू वाले 'nil' के बराबर थे (यह 'nil' वैल्यूज को 0 और झूठे के रूप में इस्तेमाल करना भी संभव था), इसलिए सशर्त स्टेटमेंट्स में वेरिएबल्स का उपयोग करना संभव था (वेरिएबल्स वैल्यूज वैसी ही हैं जैसे कि TRUE) 'और जिनका कोई मूल्य' FALSE 'के बराबर नहीं था)।

स्विफ्ट 'वैकल्पिक मूल्य' प्रदान करके प्रकार की सुरक्षा प्रदान करता है। यानी यह विभिन्न प्रकारों के चर असाइन करने से उत्पन्न त्रुटियों को रोकता है।

इसलिए स्विफ्ट में, सशर्त बयानों पर केवल बूलियंस प्रदान किया जा सकता है।

var hw = "Hello World"

यहाँ, भले ही 'hw' एक स्ट्रिंग है, लेकिन इसका उपयोग उद्देश्य C जैसे कथन में नहीं किया जा सकता है।

//This is an error

if hw

 {..}

इसके लिए इसे बनाने की आवश्यकता है,

var nhw : String? = "Hello World"

//This is correct

if nhw

 {..}

2

! किसी वस्तु के अंत में कहते हैं कि वस्तु एक वैकल्पिक है और इसे खोलना है यदि यह अन्यथा शून्य को लौटा सकती है। यह अक्सर त्रुटियों को फंसाने के लिए उपयोग किया जाता है जो अन्यथा प्रोग्राम को क्रैश कर देगा।


2

शॉर्ट में (!): आपके द्वारा एक चर घोषित किए जाने के बाद और आप निश्चित हैं कि चर एक मूल्य धारण कर रहा है।

let assumedString: String! = "Some message..."
let implicitString: String = assumedString

और आप मूल्य के बाद हर पर यह करना होगा ...

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark

1

जॉन एक वैकल्पिक व्यक्ति है, जिसका अर्थ है कि यह एक मूल्य पकड़ सकता है या शून्य हो सकता है।

john.apartment = number73

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

john!.apartment = number73

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

प्रलेखन में इसका उपयोग करने के लिए एक अच्छा उदाहरण शामिल है जहां ConvertNumber एक वैकल्पिक है।

if convertedNumber {
    println("\(possibleNumber) has an integer value of \(convertedNumber!)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}

क्या आप कह रहे हैं कि यदि जॉन शून्य है, और मैं जाता हूं john.apartment = number73, तो इसका परिणाम तब तक नहीं होगा जब तक कि मैं '' डाल न दूं! जॉन के बाद?
ट्रॉय

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

1
अगर मुझे सभी वैकल्पिक संस्करणों के लिए एक विस्मयादिबोधक बिंदु का उपयोग करना चाहिए, तो ऐप्पल ने भी इसके साथ परेशान क्यों किया, क्योंकि इसे बनाने का विरोध किया गया था इसलिए विस्मयादिबोधक बिंदु की कमी का मतलब एक ही बात है? यह अनावश्यक ब्लोट की तरह लगता है ... या यह एक ऐसा मामला है जहां यह वैकल्पिक संस्करण के साथ विस्मयादिबोधक बिंदु का उपयोग नहीं करने के लिए समझ में आता है?
ट्रॉय

जब आप वैकल्पिक की आवश्यकता होती है तो आप विस्मयादिबोधक बिंदु का उपयोग करते हैं। जैसे जॉन के गुणों तक पहुँचने के मामले में। आप var जैक की तरह कुछ कर सकते हैं: व्यक्ति? = जॉन जहां जैक भी एक वैकल्पिक या var जैक है: व्यक्ति = जॉन! जहां जैक एक व्यक्ति है और शून्य नहीं है
कॉनर

ठीक है, लेकिन मूल उदाहरण में, यह तथ्य नहीं है कि मैं johnवैकल्पिक रूप से बता रहा हूं कि संकलक को बताएं कि मुझे गैर-शून्य होना चाहिए? ... और आपके var jack: Person = john!उदाहरण में, की कमी नहीं है? बाद व्यक्ति ने संकलक को बताया कि आपको johnगैर-शून्य होना चाहिए? कुल मिलाकर, !बस लगता है कि बेमानी की तरह लगता है ... यह अभी भी लगता है कि मैं "क्यों" का कुछ हिस्सा याद कर रहा हूँ !...
ट्रॉय

1

इसे सीधे शब्दों में कहें, विस्मयादिबोधक चिह्न का मतलब है कि एक वैकल्पिक अलिखित किया जा रहा है। एक वैकल्पिक एक वैरिएबल है जिसमें एक मान हो सकता है या नहीं - इसलिए आप यह जाँच कर सकते हैं कि यदि वैरिएबल खाली है, यदि यहां दिए गए स्टेटमेंट के रूप में एक आइए स्टेटमेंट का उपयोग कर , और फिर इसे अनचेक करें। यदि आप किसी ऐसे विकल्प को खोलते हैं, जो खाली है, तो भी आपका प्रोग्राम क्रैश हो जाएगा, इसलिए सावधान रहें! एक चर के लिए एक स्पष्ट काम के अंत में एक प्रश्न चिह्न लगाकर वैकल्पिक घोषित किया जाता है, उदाहरण के लिए मैं लिख सकता हूं:

var optionalExample: String?

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

उम्मीद है कि मदद की।


1

सरल कार्यों में

अंकन अंकन का उपयोग यह दर्शाता है कि चर में शून्य मान होना चाहिए (यह कभी शून्य नहीं होना चाहिए)


1

पूरी कहानी एक वैकल्पिक स्विफ्ट नामक सुविधा के साथ शुरू होती है। ये वे वेरिएशन हैं जिनका कोई मान हो सकता है या कोई मान नहीं हो सकता है। सामान्य स्विफ्ट में हमें एक वैरिएबल का उपयोग करने की अनुमति नहीं है, जो कि आरंभीकृत नहीं है, क्योंकि इससे क्रैश या अनपेक्षित कारण हो सकते हैं और बैक प्लेस के लिए एक प्लेसहोल्डर भी हो सकता है। इस प्रकार एक वैरिएबल घोषित करने के लिए जिसका मूल्य शुरू में निर्धारित नहीं होता है हम '?' का उपयोग करते हैं। जब इस तरह के एक चर को घोषित किया जाता है, तो इसे कुछ अभिव्यक्ति के हिस्से के रूप में उपयोग करने के लिए उपयोग करने से पहले उन्हें खोलना नहीं होता है, अलॉपरिंग एक ऑपरेशन है जिसके माध्यम से एक चर का मूल्य पता चलता है जो वस्तुओं पर लागू होता है। यदि आप उन्हें उपयोग करने की कोशिश करते हैं तो बिना किसी समय के संकलन के बिना आपको समय त्रुटि का सामना करना पड़ेगा। एक वैरिएबल को खोलना जो एक वैकल्पिक संस्करण है, विस्मयादिबोधक चिह्न "!" प्रयोग किया जाता है।

अब ऐसे समय होते हैं जब आप जानते हैं कि ऐसे वैकल्पिक चर को उदाहरण के लिए सिस्टम द्वारा या आपके स्वयं के कार्यक्रम के लिए मान सौंपा जाएगा, लेकिन कुछ समय बाद, उदाहरण के लिए UI आउटलेट, ऐसी स्थिति में प्रश्न चिह्न का उपयोग करके वैकल्पिक चर घोषित करने के बजाय "?" हम प्रयोग करते हैं "!"।

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

इस प्रकार विस्मयादिबोधक चिह्न के दो अलग-अलग उपयोग होते हैं, 1. एक वैरिएबल घोषित करने के लिए जो वैकल्पिक होगा और निश्चित रूप से बाद में मूल्य प्राप्त करेगा। एक अभिव्यक्ति में इसका उपयोग करने से पहले एक वैकल्पिक चर को खोलना।

ऊपर बहुत अधिक तकनीकी सामान का विवरण बचा जाता है, मैं उम्मीद है।


1

यदि आप इसे वैकल्पिक के रूप में उपयोग करते हैं, तो यह वैकल्पिक को खोल देता है और देखता है कि क्या कुछ है। यदि आप इसे if-else स्टेटमेंट में उपयोग करते हैं तो वह NOT का कोड है। उदाहरण के लिए,

if (myNumber != 3){
 // if myNumber is NOT 3 do whatever is inside these brackets.
)

1

एक वैकल्पिक चर में एक मान हो सकता है या नहीं भी हो सकता है

मामला एक: var myVar:String? = "Something"

मामला 2: var myVar:String? = nil

अब यदि आप myVar से पूछते हैं, तो आप संकलक से कह रहे हैं कि यदि वह मामले में मान लौटा दे तो यह वापस आ जाएगा "Something"

2 दुर्घटना होने पर यह दुर्घटनाग्रस्त हो जाएगा।

मतलब! चिह्न संकलक को एक मूल्य वापस करने के लिए मजबूर करेगा, भले ही वह वहां न हो। यही कारण है कि नाम बल खोलना


@Moritz। मैं नहीं जानता कि क्या ऐसा है? यदि मैं पहले से ही एक प्रश्न का उत्तर दे दूं तो मैं जवाब नहीं दूंगा? क्या मुझे कोई समस्या हो रही है या मेरे जवाब में कुछ गलत है? मुझे समझ में नहीं आता है कि आप इसे सही तरीके से जवाब देने के लिए इसे क्यों नकार रहे हैं? मैंने अवधारणा की मेरी समझ के आधार पर उत्तर देने का प्रयास किया। मुझे लगता है कि कुछ लोग इसे स्पष्ट और आसान स्पष्टीकरण के लिए उपयोगी पाएंगे।
आशीष पाइसे

@Moritz अब यह रचनात्मक है। तुम मुझे पहली जगह में इस सुधार को बताया जाना चाहिए था, अगर यह कारण था। प्रतिक्रिया के लिए धन्यवाद। मैंने इसे ठीक किया है।
आशीष पाइसे

0
Simple the Optional variable allows nil to be stored.

var str : String? = nil

str = "Data"

To convert Optional to the Specific DataType, We unwrap the variable using the keyword "!"

func get(message : String){
   return
}

get(message : str!)  // Unwapped to pass as String

1
कृपया ऐसे उत्तर न लिखें जो पहले से मौजूद उत्तर द्वारा कवर नहीं किए गए हैं।
दलिजा प्रसनिकर

-1

अपने आप से पूछो

  • क्या प्रकार person?में एक apartmentसदस्य / संपत्ति है? या
  • क्या प्रकार personमें एक apartmentसदस्य / संपत्ति है?

यदि आप इस प्रश्न का उत्तर नहीं दे सकते हैं, तो पढ़ना जारी रखें:

समझने के लिए आपको जेनरिक की समझ के सुपर-बेसिक स्तर की आवश्यकता हो सकती है । देखें यहाँ । स्विफ्ट में बहुत सारी चीजें जेनरिक का उपयोग करके लिखी गई हैं। वैकल्पिक शामिल थे

नीचे दिए गए कोड को स्टैनफोर्ड वीडियो से उपलब्ध कराया गया है । अत्यधिक आपको पहले 5 मिनट देखने की सलाह देते हैं

एक वैकल्पिक केवल 2 मामलों वाला एक एनम है

enum Optional<T>{
    case None
    case Some(T)
}

let x: String? = nil //actually means:

let x = Optional<String>.None

let x :String? = "hello" //actually means:

let x = Optional<String>.Some("hello")

var y = x! // actually means:

switch x {
case .Some(let value): y = value
case .None: // Raise an exception
}

वैकल्पिक बाध्यकारी:

let x:String? = something
if let y = x {
    // do something with y
}
//Actually means:

switch x{
case .Some(let y): print)(y) // or whatever else you like using 
case .None: break
}

जब आप कहते हैं कि var john: Person?आप वास्तव में ऐसे हैं:

enum Optional<Person>{
case .None
case .Some(Person)
}

ऊपर enum किसी भी है संपत्ति नामित apartment? क्या आप इसे कहीं भी देखते हैं? यह वहाँ बिल्कुल नहीं है ! हालांकि अगर आप इसे खोल देते हैं, person!तो आप कर सकते हैं ... यह हुड के तहत क्या करता है:Optional<Person>.Some(Person(name: "John Appleseed"))


यदि आपने var john: Personइसके बजाय परिभाषित किया था : var john: Person?तो आपको अब !उपयोग करने की आवश्यकता नहीं होगी , क्योंकि Personस्वयं का एक सदस्य हैapartment


क्यों !नहीं खोलना का उपयोग करने पर एक भविष्य की चर्चा के रूप में कभी-कभी इस क्यू एंड ए को देखने की सिफारिश नहीं की जाती है


2
उपरोक्त वास्तविक स्लाइड का उपयोग संभवतः कॉपीराइट का उल्लंघन है: "... स्टैनफोर्ड विश्वविद्यालय हमारे iTunes यू संग्रह में सभी सामग्री के लिए कॉपीराइट बनाए रखता है।" , http://itunes.stanford.edu से । उत्तर देने के लिए संभवतः बेहतर है, आपके अपने शब्दों में, जिस सामग्री को आपने पाठ्यक्रम से सीखा है, जिसे आप इस प्रश्न का उत्तर देने के लिए अनुभव करते हैं (और स्लाइड का उपयोग करने के बजाय, कोड के रूप में उनके प्रासंगिक भागों को संदर्भ के साथ स्वाभाविक रूप से उद्धृत करते हैं)।
dfri

2
आपका तर्क वितर्क विज्ञापन पॉपुलम है । वैसे भी, मुझे विश्वास नहीं है कि स्टैनफोर्ड यहां आएगा और DMCA अधिकारों को लागू करेगा , लेकिन यह हमेशा बेहतर होगा यदि आपके उत्तर आधिकारिक / वैध स्रोतों के आधार पर आपके स्वयं के शब्दों में हों , न कि उन स्रोतों को ऊपर के रूप में कॉपी करने के रूप में; विशेष रूप से जब हम कॉपीराइट वाली स्लाइड्स के बारे में बात करते हैं: फिर से, कोड ब्लॉक में स्लाइड्स की सामग्री को उद्धृत करने के लिए बेहतर है (कोड की छवियां आम तौर पर एसओ में एक नहीं-नहीं है!)।
डॉग

1
मैं जिस मेटा पोस्ट से जुड़ा था, वह केवल SO: s दृष्टिकोण का वर्णन करता है: एक पोस्ट जैसे कि यह स्वाभाविक रूप से हटाया नहीं जाएगा यदि कोई यादृच्छिक उपयोगकर्ता इसे कॉपीराइट उल्लंघन के रूप में रिपोर्ट करता है: केवल अगर उदाहरण के लिए एक स्टैनफोर्ड प्रतिनिधि। यहां आने के लिए और पद को हटाए जाने के लिए एसओ को इसे लागू करने की आवश्यकता थी । इसलिए मैंने लिखा " मुझे विश्वास नहीं है कि स्टैनफोर्ड यहां आएंगे और DMCA अधिकारों को लागू करेंगे, ..." । ऊपर मेरी बात यह है कि मेरा मानना ​​है कि यह संभवतः कॉपीराइट का उल्लंघन है (जिसे मैं गलत मानता हूं), लेकिन स्वाभाविक रूप से कोई भी इसे लागू नहीं करेगा। ...
डॉग

1
लेकिन यह एक तरफ, प्रश्न या उत्तर पोस्ट करना जिसमें कोड की छवियां होती हैं, कई कारणों से हतोत्साहित होता है। इसे लपेटने के लिए: मैंने इन टिप्पणियों के साथ इंगित करने की कोशिश की है कि मुझे विश्वास है कि यह उत्तर, इसके वर्तमान रूप में, पूरी तरह से उतना अच्छा नहीं है जितना कि हो सकता है, दो प्रमुख कारणों (कॉपीराइट स्लाइड, कोड की छवि) के कारण। स्वाभाविक रूप से कोई भी, स्वयं सहित, इस बारे में कुछ भी नहीं करेगा, मैं इसे भविष्य के संदर्भ के लिए बस इंगित कर रहा हूं (या संभवतः आपको कोड को ब्लॉक के बजाय इस पोस्ट को संपादित करने के लिए प्रोत्साहित कर रहा है)। सहमत, आईट्यून्स यू! :)
डॉग

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