2015-07-04 10 views
5

में वैकल्पिक बाध्यकारी का उपयोग कैसे करें मैं स्विफ्ट सीखने के लिए नया हूं इसलिए मैंने फैसला किया कि मैं इसके बजाय स्विफ्ट 2 सीख सकता हूं। निम्नलिखित कोड स्निपेट को छोड़कर अब तक सबकुछ मुझे समझ में आया है। उम्मीद है कि कोई मेरे लिए इस पर कुछ प्रकाश डाल सकता है।स्विफ्ट 2

//: Playground - noun: a place where people can play 
import UIKit 

//Works 
let possibleNumber="2" 
if let actualNumber = Int(possibleNumber) { 
    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)") 
} 
else { 
    print("could not be converted to integer") 
} 

//Doesn't Work and I'm not sure why 
let testTextField = UITextField() 
testTextField.text = "2" 
let numberString = testTextField.text //I know this is redundant 

if let num = Int(numberString) { 
    print("The number is: \(num)") 
} 
else { 
    print("Could not be converted to integer") 
} 

कोड के शीर्ष भाग से एप्पल के स्विफ्ट 2 ebook सीधे है और यह मेरे लिए समझ में आता है कि यह कैसे वैकल्पिक बंधन का उपयोग करता है किसी पूर्णांक पर स्ट्रिंग कन्वर्ट करने के लिए। कोड का दूसरा भाग मूल रूप से वही है, सिवाय इसके कि स्ट्रिंग UITextField की टेक्स्ट प्रॉपर्टी से आती है।

खेल का मैदान निष्पादन में विफल रहा है: /var/folders/nl/5dr8btl543j51jkqypj4252mpcnq11/T/./lldb/843/playground21.swift:18:18: त्रुटि: वैकल्पिक का मूल्य कोड के निचले हिस्से निम्न त्रुटि देता है टाइप करें 'स्ट्रिंग?' अनचाहे नहीं; क्या आप '!' का उपयोग करना चाहते थे या '?'? यदि जाने num = इंट (numberString) {

मैं इस लाइन का उपयोग करके समस्या तय:

if let num = Int(numberString!) { 

मैं सिर्फ जानना चाहता है कि दूसरे उदाहरण की जरूरत है चाहता हूँ! और पहला नहीं है। मुझे यकीन है कि समस्या को इस तथ्य के साथ करना है कि मुझे टेक्स्टफील्ड से स्ट्रिंग मिल रही है। धन्यवाद!

+0

एक जवाब स्वीकार करने के लिए याद रखें अगर यह आपकी समस्या नहीं सुलझती :-) – Fogmeister

+0

धन्यवाद! मैंने पहले इस साइट का उपयोग किया है लेकिन कभी भी एक प्रश्न पोस्ट नहीं किया है। आपका जवाब बहुत उपयोगी था। – jobber80

+0

स्टैक ओवरफ्लो में आपका स्वागत है :-) खुशी है कि मैं मदद करने में सक्षम था। – Fogmeister

उत्तर

7

अंतर यह है कि पहले मामले में possibleNumber एक वैकल्पिक चर नहीं है। यह निश्चित रूप से एक स्ट्रिंग है। यह शून्य नहीं हो सकता है।

दूसरे मामले में textField.text एक वैकल्पिक स्ट्रिंग देता है और इसलिए numberString एक वैकल्पिक चर है। यह शून्य हो सकता है।

अब ... रूपांतरण Int("") एक वैकल्पिक int देता है। यदि स्ट्रिंग "एबीसी" है तो यह एक संख्या वापस नहीं कर सकती है इसलिए शून्य वापस आती है। यह है कि आप if let... कथन के साथ अनचाहे हैं।

हालांकि, दूसरे मामले में आपकी स्ट्रिंग भी वैकल्पिक है और Int() वैकल्पिक को स्वीकार नहीं करेगा। तो आप इसे खोलने के लिए मजबूर हैं। यह खतरनाक है क्योंकि स्ट्रिंग शून्य होने पर यह ऐप को क्रैश कर सकती है।

क्या आप के बजाय कर सकता है यह है ...

if let numberString = textFeidl.text, 
    number = Int(numberString) { 
    // use the number 
} 

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

स्विफ्ट 2 में आप guard let फ़ंक्शन का भी उपयोग कर सकते हैं।

बस देखा है कि आप स्विफ्ट 2.

उपयोग कर रहे हैं आप यह भी इस तरह से कर सकते हैं ...

func getNumber() -> Int { 
    guard let numberString = textField.text, 
      number = Int(numberString) 
      else { 
      return 0 
    } 

    return number 
} 
संबंधित मुद्दे