क्या रेंज ऑपरेटर का उपयोग करना संभव है ...
और ..<
यदि स्टेटमेंट के साथ। कुछ इस तरह से:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
क्या रेंज ऑपरेटर का उपयोग करना संभव है ...
और ..<
यदि स्टेटमेंट के साथ। कुछ इस तरह से:
let statusCode = 204
if statusCode in 200 ..< 299 {
NSLog("Success")
}
जवाबों:
आप "पैटर्न-मैच" ऑपरेटर का उपयोग कर सकते हैं ~=
:
if 200 ... 299 ~= statusCode {
print("success")
}
या एक अभिव्यक्ति पैटर्न के साथ एक स्विच-स्टेटमेंट (जो आंतरिक रूप से पैटर्न-मैच ऑपरेटर का उपयोग करता है):
switch statusCode {
case 200 ... 299:
print("success")
default:
print("failure")
}
ध्यान दें कि ..<
एक सीमा को दर्शाता है जो ऊपरी मूल्य को छोड़ देता है, इसलिए आप शायद चाहते हैं
200 ... 299
या 200 ..< 300
।
अतिरिक्त जानकारी: जब अनुकूलन के साथ Xcode 6.3 में उपरोक्त कोड संकलित किया जाता है, तो परीक्षण के लिए
if 200 ... 299 ~= statusCode
वास्तव में कोई फ़ंक्शन कॉल बिल्कुल उत्पन्न नहीं होती है, केवल तीन विधानसभा निर्देश:
addq $-200, %rdi
cmpq $99, %rdi
ja LBB0_1
यह ठीक उसी विधानसभा कोड है, जिसके लिए जनरेट किया गया है
if statusCode >= 200 && statusCode <= 299
आप इसे सत्यापित कर सकते हैं
xcrun -sdk macosx स्विफ्ट -O -मिट-असेंबली main.swift
स्विफ्ट 2 के रूप में, यह लिखा जा सकता है
if case 200 ... 299 = statusCode {
print("success")
}
इफ-स्टेटमेंट्स के लिए नए पेश किए गए पैटर्न-मैचिंग का उपयोग करना। स्विफ्ट 2 भी देखें - "यदि" में पैटर्न मिलान ।
func ~= (Range<A>, A) -> Bool
कहा जाता है। मैं मानूंगा कि यह फ़ंक्शन O (1) के साथ काम करता है।
xcrun -sdk macosx swift -emit-assembly main.swift
असेंबली लाइन पर कोड को संकलित किया और विधानसभा कोड का निरीक्षण किया। तब मैं xcrun swift-demangle ...
बुलाए गए फ़ंक्शन के नाम को डी-मैन करता था। - दुर्भाग्य से, Xcode अभी तक स्विफ्ट फ़ाइलों के लिए असेंबली कोड नहीं बना सकता है, शायद यह बाद के संस्करण में काम करेगा।
यह संस्करण पैटर्न मिलान से अधिक पठनीय प्रतीत होता है:
if (200 ... 299).contains(statusCode) {
print("Success")
}
यह एक पुराना धागा है, लेकिन मुझे लगता है कि हम इस पर विचार कर रहे हैं। यह मुझे सबसे अच्छा जवाब है बस लगता है
if statusCode >= 200 && statusCode <= 299
वहाँ कोई नहीं
if 200 > statusCode > 299
फ़ॉर्म जो मुझे ज्ञात है, और अन्य सुझाए गए समाधान फ़ंक्शन कॉल कर रहे हैं, जो पढ़ने में कठिन हैं, और निष्पादित करने के लिए धीमी हो सकती हैं। पैटर्न मैच विधि जानने के लिए एक उपयोगी चाल है, लेकिन इस समस्या के लिए एक गरीब फिट की तरह लगता है।
व्यक्तिगत रूप से, मुझे लगता है कि पैटर्न मैच ऑपरेटर छुपा हुआ होगा, और इच्छा है कि संकलक if x in 1...100
सिंटैक्स का समर्थन करेगा । यह बहुत अधिक सहज और पढ़ने में आसान हैif 1...100 ~= x
if 200 ... 299 ~= statusCode
, कोई फ़ंक्शन कॉल नहीं :)
if 200 ... 299 ~= statusCode
में एक ही असेंबली कोड देता हैif statusCode >= 200 && statusCode <= 299
मैं 401 को छोड़कर 4xx त्रुटियों की जाँच करना चाहता था। यहाँ कोड है:
let i = 401
if 400..<500 ~= i, i != 401 {
print("yes")
} else {
print("NO")
}
मैंने रेंज .contains () ऑपरेटर को भी प्राथमिकता दी, जब तक कि इसका कार्यान्वयन अक्षम न हो जाए - https://oleb.net/blog/2015/09/swift-ranges-and-intervals/
हम एक सीमा का उपयोग करके स्थिति x <0 का प्रतिनिधित्व कर सकते हैं: (Int.min .. <0) .contains (x) बिल्कुल समकक्ष है। हालांकि यह काफी धीमा है। इसमें (_ :) के डिफ़ॉल्ट कार्यान्वयन पूरे संग्रह का पता लगाता है, और सबसे खराब स्थिति में एक लूप नौ क्विंटल बार निष्पादित करना सस्ता नहीं है।