সুইফট: সুইচ স্টেটমেন্টে টেস্ট ক্লাসের ধরণ


206

সুইফটে আপনি 'is' ব্যবহার করে কোনও শ্রেণীর শ্রেণীর ধরণটি পরীক্ষা করতে পারেন। আমি কীভাবে এটি একটি 'সুইচ' ব্লকে অন্তর্ভুক্ত করতে পারি?

আমি মনে করি এটি সম্ভব নয়, তাই আমি ভাবছি যে এটির সেরা উপায়টি কী।

উত্তর:


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" - এবং তারপরে তিনি কখনই এটি ব্যবহার করেন না। এক্স)
রাফেল

3
@ রাফেল আমি case is Doubleউত্তরে দেখতে পাচ্ছি
গোব

2
@ গোব আমার খারাপ, এটি মিস করেছেন। :> আমার অজুহাত: সম্ভবত এটি সবচেয়ে উদাহরণস্বরূপ উদাহরণ না?
রাফেল

46

"কেস হ'ল - কেসটি ইন্ট, স্ট্রিং: " ক্রিয়াকলাপের উদাহরণ স্থাপন করা , যেখানে একই রকম অবজেক্টের ধরণের জন্য একই ক্রিয়াকলাপ সম্পাদন করতে একাধিক কেস একসাথে ব্যবহার করা যেতে পারে। এখানে "," প্রকারগুলি পৃথক করে কোনও ওআর অপারেটরের মতো কাজ করে।

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")
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.