स्विफ्ट: स्विच स्टेटमेंट में टेस्ट क्लास का प्रकार


207

स्विफ्ट में आप '' है 'का उपयोग करके किसी वर्ग के प्रकार की जांच कर सकते हैं। मैं इसे 'स्विच' ब्लॉक में कैसे शामिल कर सकता हूं?

मुझे लगता है कि यह संभव नहीं है, इसलिए मैं सोच रहा हूं कि इसके आसपास का सबसे अच्छा तरीका क्या है।

जवाबों:


436

आप बिल्कुल isएक switchब्लॉक में उपयोग कर सकते हैं । स्विफ्ट प्रोग्रामिंग लैंग्वेज में "टाइपिंग फॉर एनी एंड एनीऑबजेक्ट" देखें (हालांकि यह Anyपाठ्यक्रम तक सीमित नहीं है )। उनके पास एक व्यापक उदाहरण है:

for thing in things {
    switch thing {
    case 0 as Int:
        println("zero as an Int")
    case 0 as Double:
        println("zero as a Double")
    case let someInt as Int:
        println("an integer value of \(someInt)")
    case let someDouble as Double where someDouble > 0:
        println("a positive double value of \(someDouble)")
// here it comes:
    case is Double:
        println("some other double value that I don't want to print")
    case let someString as String:
        println("a string value of \"\(someString)\"")
    case let (x, y) as (Double, Double):
        println("an (x, y) point at \(x), \(y)")
    case let movie as Movie:
        println("a movie called '\(movie.name)', dir. \(movie.director)")
    default:
        println("something else")
    }
}

2
हाय, रोब। बस जिज्ञासा: चूंकि हम ऊपर के thingकिसी भी एस में स्विच ` का उपयोग नहीं कर रहे हैं case, यहाँ उपयोग करने से क्या होगा thing? मैं इसे देखने में असफल रहा। धन्यवाद।
उन्हेलिग

3
प्रत्येक मामले में परीक्षण किया जा रहा मूल्य है। इसलिए अगर बात मूवी की है, तो यह वैल्यू सिंबल मूवी से जुड़ी होगी।
रोब नेपियर

5
"आप बिल्कुल उपयोग कर सकते हैं is" - और फिर वह इसका उपयोग कभी नहीं करता है। X)
राफेल

3
मैं देख सकता हूँ @Raphael case is Doubleजवाब में
Gobe

2
@ मेरा बुरा, यह याद किया। :> मेरा बहाना: शायद यह सबसे अधिक उदाहरण नहीं है?
राफेल

46

उदाहरण के लिए "केस है - केस इन्ट, इज स्ट्रांग: " ऑपरेशन है, जहां समान मामलों के प्रकार के लिए एक ही गतिविधि को करने के लिए एक साथ कई मामलों का उपयोग किया जा सकता है। यहां "," प्रकार के मामले को अलग करना OR ऑपरेटर की तरह काम कर रहा है ।

switch value{
case is Int, is String:
    if value is Int{
        print("Integer::\(value)")
    }else{
        print("String::\(value)")
    }
default:
    print("\(value)")
}

डेमो लिंक


11
दो मामलों को एक साथ रखकर उन्हें अलग करना ifसंभवत: अपनी बात को प्रमाणित करने का सबसे अच्छा उदाहरण नहीं है।
युद्ध

1
यह शायद बेहतर होगा कि valueकुछ है कि से एक हो सकता है Int, Float, Double, और इलाज Floatऔर Doubleउसी तरह।
noamtm

30

मामले में आपके पास कोई मूल्य नहीं है, बस कोई वस्तु:

स्विफ्ट 4

func test(_ val:Any) {
    switch val {
    case is NSString:
        print("it is NSString")
    case is String:
        print("it is a String")
    case is Int:
        print("it is int")
    default:
        print(val)
    }
}


let str: NSString = "some nsstring value"
let i:Int=1
test(str) 
// it is NSString
test(i) 
// it is int

17

मुझे यह वाक्य रचना पसंद है:

switch thing {
case _ as Int: print("thing is Int")
case _ as Double: print("thing is Double")
}

चूंकि यह आपको कार्यक्षमता को तेजी से आगे बढ़ाने की संभावना देता है, जैसे:

switch thing {
case let myInt as Int: print("\(myInt) is Int")
case _ as Double: print("thing is Double")
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.