ios - क्यों UITextField के पाठ संपत्ति स्विफ्ट 2 में एक वैकल्पिक करने के लिए बदल गया था?




swift uikit (3)

UIKit diff दस्तावेज़ के अनुसार, Ios 9 / स्विफ्ट 2 में

var text: String! अलग var text: String? बन गया है var text: String?

UITextField के लिए प्रलेखन के अनुसार यह स्पष्ट रूप से कहते हैं

This string is @"" by default.

मैं इस परिवर्तन के उद्देश्य को समझ नहीं पाया। यदि पाठ फ़ील्ड बिल्कुल मौजूद है तो क्या वह संपत्ति हमेशा खाली स्ट्रिंग नहीं होनी चाहिए? यह फ़ील्ड रिक्त स्ट्रिंग लौटते समय क्या करता है? एक बार उपयोगकर्ता इसके साथ संपर्क करता है? एक बार दृश्य पदानुक्रम में जोड़ा गया है? क्या बिंदु पर यह nil वापस करता है?

यदि टेक्स्ट फ़ील्ड पहली जगह में मौजूद है, तो क्या यह मानना ​​हमेशा सुरक्षित होता है कि टेक्स्ट प्रॉपर्टी भी मौजूद है? यह सिर्फ ऐसा लगता है जैसे कि .text को .text! की खोज / बदलें .text!

मुझे डॉक्स में इसका उल्लेख नहीं है, इसलिए मुझे पता नहीं है कि शायद किसी के पास कोई बैकस्टोरी है या यह क्यों परिवर्तित हो गया है।


संक्षेप में, (शीर्षक का जवाब) यह नहीं था।

विस्तार से:

मेरे लिए यह एक बहुत अधिक समझ में आता है कि इसे एक वैकल्पिक के रूप में रखना अनिवार्य नहीं है। ऐप्पल केवल optional! उपयोग करने के लिए devs को प्रेरित कर रहा है optional! और यह केवल समझ में आता है कि वे एपीआई के समान नियम लागू करते हैं।

इसका कारण यह है कि यह शून्य हो सकता है, और अगर इसके साथ घोषित किया गया है तो इससे कोई फर्क नहीं पड़ता है ? या ! कोड चलाने के लिए का उपयोग करना ! वास्तव में केवल Xcode में चेतावनियां निकालती हैं जो वास्तव में आसान हैं, विशेषकर जब यह एपीआई कोड की बात आती है। अगर आपको नहीं पता कि यह वास्तव में एक वैकल्पिक है तो आप केवल परेशानी के लिए पूछ रहे हैं।

शून्य के लिए जांच अब भी guard साथ बेहतर है और आप इसे "" चेक के साथ चेन कर सकते हैं, इसलिए यह वास्तव में अधिक काम नहीं है।

सामान्य विकल्प में बेहतर होता है क्योंकि कुछ ऐसी है जो स्मृति का उपयोग नहीं कर रहा है हमारे पास जितने अधिक विकल्प हैं, हल्का हम अपने ऐप को बना सकते हैं। इसके अलावा यह भी बुरा नहीं लग रहा है और कयामत के पिरामिड में जोड़ नहीं है।

यह उदाहरण दोनों तारों को तर्क के रूप में ले जाएगा, निकालें ? func पैरामीटर में और Xcode आपको चेतावनी देने के लिए होगा।

मैं इस हिस्से को सीधे उत्तर देने में भूल गया: जब आप इसे शून्य पर सेट करते हैं तो यह शून्य हो जाता है, जो कि आप थोड़ी सी मेमोरी को बचाने के लिए कर सकते हैं यह समझ में नहीं आता कि इसे शून्य पर सेट करने का विकल्प है और नहीं है, एक्सकोड आपको इसे ठीक से संभाल करने के लिए चेतावनी दी है। => यह असंभव है ...

var forcedUnwrappedString : String! = ""
var optionalString : String? = ""

forcedUnwrappedString = nil
optionalString = nil

func doSomethingWithString(string : String?) -> String? {
    guard var unwrappedString = string else {
        // error handling here
        return nil
    }
    let tempString = unwrappedString + "!"

    return tempString
}

func doSomethingUnsafeWithString(string : String) -> String {

    let tempString = string
    return tempString

}

var newString = doSomethingWithString(optionalString)
var newString2 = doSomethingWithString(forcedUnwrappedString)

newString = doSomethingUnsafeWithString(optionalString!) // this will crash without a warning fro xcode
newString2 = doSomethingUnsafeWithString(forcedUnwrappedString) // this will crash without a warning fro xcode

अद्यतन करें:

UITextfield की पाठ प्रॉपर्टी एक सेटर है जो हमेशा nil मामले में सेट करती है, डॉक्स में या UIKit में कहीं भी जानकारी नहीं है।

var textField = UITextField(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
var string = textField.text // string = ""
textField.text = nil
string = textField.text // string = ""

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

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


इसके अलावा आप यूनिकोड वर्ण के साथ इस हैक का उपयोग कर सकते हैं:

extension UITextField {
    var teхt: String { //"х" is U+0445 unicode character
        return self.text ?? ""
    }
}




swift2