स्विफ्ट में if-statement के भीतर कई लेट-असिंग का उपयोग करना


144

मैं एक शब्दकोश से दो मूल्यों को उजागर कर रहा हूं और उनका उपयोग करने से पहले मुझे उन्हें डालना होगा और सही प्रकार के लिए परीक्षण करना होगा। मैंने ये ढूंढ निकाला:

var latitude : AnyObject! = imageDictionary["latitude"]
var longitude : AnyObject! = imageDictionary["longitude"]

if let latitudeDouble = latitude as? Double  {
   if let longitudeDouble = longitude as? Double {
       // do stuff here
   }
}

लेकिन मैं दो को पैक करना चाहूंगा यदि प्रश्न एक में हों। ताकि यह कुछ इस तरह हो:

if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
    // do stuff here
}

वह वाक्य रचना काम नहीं कर रही है, इसलिए मैं सोच रहा था कि क्या ऐसा करने का एक सुंदर तरीका है।



प्रकारों से मिलान करने के लिए एक स्विच स्टेटमेंट का उपयोग करने का एक तरीका हो सकता है। डॉक्स पर एक नज़र डालें :
lomokat

जवाबों:


305

स्विफ्ट 3 के लिए अपडेट:

निम्नलिखित स्विफ्ट 3 में काम करेगा:

if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
    // latitudeDouble and longitudeDouble are non-optional in here
}

बस यह याद रखना सुनिश्चित करें कि यदि किसी वैकल्पिक वैकल्पिक बाइंडिंग विफल हो जाती है, तो if-letब्लॉक के अंदर कोड निष्पादित नहीं किया जाएगा।

नोट: क्लॉस सभी को 'लेट' क्लॉज होने की जरूरत नहीं है, आपके पास बूलियन चेक की कोई भी श्रृंखला अल्पविराम से अलग हो सकती है।

उदाहरण के लिए:

if let latitudeDouble = latitude as? Double, importantThing == true {
    // latitudeDouble is non-optional in here and importantThing is true
}

स्विफ्ट 1.2:

Apple ने आपके प्रश्न को पढ़ा हो सकता है, क्योंकि आपके उम्मीद के लिए कोड स्विफ्ट 1.2 (आज बीटा में) में ठीक से संकलित है:

if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
    // do stuff here
}

1.1 और पहले स्विफ्ट:

यहाँ अच्छी खबर है - आप पूरी तरह से ऐसा कर सकते हैं। आपके दो मूल्यों के टपल पर एक स्विच स्टेटमेंट पैटर्न-मिलान का उपयोग Doubleएक ही समय में दोनों को करने के लिए कर सकता है:

var latitude: Any! = imageDictionary["latitude"]
var longitude: Any! = imageDictionary["longitude"]

switch (latitude, longitude) {
case let (lat as Double, long as Double):
    println("lat: \(lat), long: \(long)")
default:
    println("Couldn't understand latitude or longitude as Double")
}

अपडेट: कोड का यह संस्करण अब ठीक से काम करता है।


यह मेरे लिए 6.1.1 में काम करता है, @AaronBratcher आपके लिए क्यों नहीं?
डेनियल गोमेज़ रिको

1
स्विफ्ट 1.2 में, यह अब एक पंक्ति में करना संभव है: stackoverflow.com/a/28418847/1698576
smithclay

आपके कोड में, आपके पास 2 अल्टरनेटिव्स हैं, जो कि आपको नहीं मिलेंगे। क्या हमेशा इसका इस्तेमाल किया जाना चाहिए? मेरा अलग भ्रामक कोड है। if let app = UIApplication.sharedApplication().delegate as? AppDelegate, let window = app.window {...}। क्या दूसरा let भी वैकल्पिक बाध्यकारी है? मेरा मतलब appहै कि अब वैकल्पिक नहीं है। सही?
हनी

1
यह है। appअब वैकल्पिक नहीं है, लेकिन इसकी windowसंपत्ति (इसका प्रकार UIWindow?) है, इसलिए आप इसे खोलना नहीं चाहते हैं।
नाटे कुक

7

स्विफ्ट 3 के साथ, आप अपनी समस्या को हल करने के लिए वैकल्पिक चैनिंग, स्विच स्टेटमेंट या वैकल्पिक पैटर्न का उपयोग कर सकते हैं।


1. if let(वैकल्पिक बाइंडिंग / वैकल्पिक चेनिंग)

स्विफ्ट प्रोग्रामिंग भाषा वैकल्पिक श्रृंखलन के बारे में कहा गया है:

कई प्रश्नों को एक साथ जंजीर में डाला जा सकता है, और यदि श्रृंखला में कोई लिंक शून्य है, तो पूरी श्रृंखला इनायत से विफल हो जाती है।

इसलिए, सबसे सरल मामले में, आप अपने वैकल्पिक चाइनिंग ऑपरेशन में कई प्रश्नों का उपयोग करने के लिए निम्न पैटर्न का उपयोग कर सकते हैं:

let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if let latitude = latitude as? Double, let longitude = longitude as? Double {
    print(latitude, longitude)
}

// prints: 2.0 10.0

2. स्विच स्टेटमेंट में ट्यूपल्स और वैल्यू बाइंडिंग का उपयोग करना

एक साधारण वैकल्पिक चाइनिंग के विकल्प के रूप में, स्विच स्टेटमेंट ट्यूपल्स और वैल्यू बाइंडिंग के साथ उपयोग किए जाने पर एक महीन दाने वाला घोल पेश कर सकता है:

let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

switch (latitude, longitude) {
case let (Optional.some(latitude as Double), Optional.some(longitude as Double)):
    print(latitude, longitude)
default:
    break
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

switch (latitude, longitude) {
case let (latitude as Double, longitude as Double):
    print(latitude, longitude)
default:
    break
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

switch (latitude as? Double, longitude as? Double) {
case let (.some(latitude), .some(longitude)):
    print(latitude, longitude)
default:
    break
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

switch (latitude as? Double, longitude as? Double) {
case let (latitude?, longitude?):
    print(latitude, longitude)
default:
    break
}

// prints: 2.0 10.0

3. if case(वैकल्पिक पैटर्न) के साथ tuples का उपयोग करना

if case( वैकल्पिक पैटर्न ) वैकल्पिक गणना के मूल्यों को अपरिवर्तित करने के लिए एक सुविधाजनक तरीका प्रदान करता है। कई प्रश्नों के साथ कुछ वैकल्पिक श्रृंखलन करने के लिए आप इसका उपयोग टुपल्स के साथ कर सकते हैं:

let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if case let (.some(latitude as Double), .some(longitude as Double)) = (latitude, longitude) {
    print(latitude, longitude)
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if case let (latitude as Double, longitude as Double) = (latitude, longitude) {
    print(latitude, longitude)
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if case let (.some(latitude), .some(longitude)) = (latitude as? Double, longitude as? Double) {
    print(latitude, longitude)
}

// prints: 2.0 10.0
let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
let latitude = dict["latitude"]
let longitude = dict["longitude"]

if case let (latitude?, longitude?) = (latitude as? Double, longitude as? Double) {
    print(latitude, longitude)
}

// prints: 2.0 10.0

5

स्विफ्ट 3.0

if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
    // do stuff here
}

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