সুইফট: স্যুইচ ক্ষেত্রে alচ্ছিক মান বিরুদ্ধে পরীক্ষা


94

সুইফট, কিভাবে আমি একটি সুইচ বিবৃতি একটি কেস লিখতে পারেন যে পরীক্ষার মান সত্যি সত্যি একটি বিষয়বস্তু বিরুদ্ধে জাগ্রত ঐচ্ছিক , কেস ঐচ্ছিক থাকে বেশি কুঁদন nil?

আমি এখানে কীভাবে কল্পনা করি এটি দেখতে পারে:

let someValue = 5
let someOptional: Int? = nil

switch someValue {
case someOptional:
    // someOptional is non-nil, and someValue equals the unwrapped contents of someOptional
default:
    // either, someOptional is nil, or someOptional is non-nil but someValue does not equal the unwrapped contents of someOptional
}

যদি আমি এটা ঠিক ভালো লিখুন, কম্পাইলার অভিযোগ যে someOptionalমোড়ানো নয়, কিন্তু আমি স্পষ্টভাবে এটি মোড়ক খোলা যোগ করে যদি !শেষ, আমি অবশ্যই একটি রানটাইম ত্রুটি পেতে যে কোনো সময় someOptionalরয়েছে nil। এর ?পরিবর্তে যুক্ত !করা আমার কাছে কিছুটা বোঝায় (chaচ্ছিক শৃঙ্খলার চেতনায়, আমি মনে করি), তবে সংকলক ত্রুটিটি দূরে সরিয়ে দেয় না (অর্থাৎ প্রকৃতপক্ষে actuallyচ্ছিককে মোড়ক দেয় না)।

উত্তর:


113

Ptionচ্ছিক ঠিক এর enumমতো:

enum Optional<T> : Reflectable, NilLiteralConvertible {
    case none
    case some(T)

    // ...
}

সুতরাং আপনি এগুলি যথারীতি "সংযুক্ত মূল্যবোধের" সাথে মিলিয়ে তুলতে পারেন:

let someValue = 5
let someOptional: Int? = nil

switch someOptional {
case .some(someValue):
    println("the value is \(someValue)")
case .some(let val):
    println("the value is \(val)")
default:
    println("nil")
}

গার্ড এক্সপ্রেশনsomeValue ব্যবহার করে আপনি যদি ম্যাচটি চান :

switch someValue {
case let val where val == someOptional:
    println(someValue)
default:
    break
}

এবং সুইফট> ২.০ এর জন্য

switch someValue {
case let val where val == someOptional:
    print("matched")
default:
    print("didn't match; default")        
}

4
মনে রাখবেন যে সুইফ্ট 3-তে কিছু / কেউই ছোট হাতের অক্ষর নয়, অর্থাত্ আপনি কিছু ব্যবহার করুন। কিছু
অ্যাডাম

55

এক্সকোড of হিসাবে, "একটি নতুন x?প্যাটার্নটি প্রতিশব্দ হিসাবে বিকল্পগুলির সাথে মেলে প্যাটার্নটিতে ব্যবহার করা যেতে পারে .some(x)"। এর অর্থ হ'ল সুইফ্ট 2 এবং পরবর্তীকালে রিন্টারোর উত্তরগুলির নীচের ভিন্নতাটিও কাজ করবে:

let knownValue = 5

switch someOptional {
case knownValue?:
    // Contents of someOptional are knownValue, defined above.
case let otherValue?:
    // Contents of someOptional are *any* non-nil value not already tested for.
    // Unwrapped contents are assigned to otherValue for use inside this case.
default:
    // someOptional is nil.
}

4
প্রশ্নটি একটি optionচ্ছিকের তুলনায় একটি অ-alচ্ছিক মানটির সাথে সম্পর্কিত, এই উত্তরটি অন্য উপায়।
মার্টিন আর

4
সত্য, তবে এই উত্তরটি মূলত ওপি দ্বারা প্রশ্নের আপডেট হিসাবে লিখেছিল তাই তাঁর কাছে এটি অকাট্য একটি কার্যকর সমাধান ছিল; আমি কেবল এটি একটি সম্প্রদায়ের উইকি উত্তরে সরিয়েছি। সম্ভবত @ জর্জিডাব্লুএস স্পষ্ট করতে পারে যে স্যুইচ ও কেস আরোগুলি স্যুইচ করা তার ব্যবহারের ক্ষেত্রে কেন কাজ করে?
স্লিপ ডি থম্পসন

4
আমি কিছুটা হারিয়েছি আপনার প্রথম দুটি ক্ষেত্রে পার্থক্য কি? someValue?অন্য কিছু সংজ্ঞায়িত মান, তবে case let val?এটি কি কেবল নিরাপদ আবরণী সংস্করণ someOptional?!
মধু

@ হানি এটি বাস্তব-বিশ্বের কোড উদাহরণ নয়; এটি কেবল রিন্টারোর উত্তরের ভিন্নতা। সুতরাং তাকে জিজ্ঞাসা করুন যে প্রশ্নটি- আমার উত্তর কার্যত তার / তার কোডের সমান। আপনি যদি যদিও রিন্টারো জিজ্ঞাসা করেন তবে আমি বিশ্বাস করি যে উত্তরটি 1 হবে it এটি লিঙ্কযুক্ত অ্যাপল ডক্সে যা আছে তা মিরর করে; ২. এটি কেবল বাক্য গঠন দেখায়; এটি কোনও স্বতন্ত্র গণনা বা ব্যবসায়ের লজিক লক্ষ্য অর্জন করে না।
স্লিপ ডি থম্পসন

@ হানি এছাড়াও, রিন্টারোর উত্তরটি মূলত সুইফট 1.x এর জন্য রচিত এবং সুইফট 2-র জন্য আপডেট করা হয়েছিল এটি সম্ভবত সম্ভব যে সংস্করণটি letআর সংকলন করে না। আমি কেন এখনই মনে করতে পারি না যে কেন সেদিন আবার কাজ করবে।
স্লিপ ডি থম্পসন

10

ইন সুইফট 4 আপনি ব্যবহার করতে পারেন ExpressibleByNilLiteral: ঐচ্ছিক ঐচ্ছিক wrappe অ্যাপল এর

https://developer.apple.com/docamentation/swift/optional

উদাহরণ

enum MyEnum {
    case normal
    case cool
}

কিছু

let myOptional: MyEnum? = MyEnum.normal

switch smyOptional {
    case .some(.normal): 
    // Found .normal enum
    break

    case .none: 
    break

    default:
    break
}

কিছুই না

let myOptional: MyEnum? = nil

switch smyOptional {
    case .some(.normal): 
    break

    case .none: 
    // Found nil
    break

    default:
    break
}

ডিফল্ট

let myOptional: MyEnum? = MyEnum.cool

switch smyOptional {
    case .some(.normal): 
    break

    case .none: 
    break

    default:
    // Found .Cool enum
    break
}

মান সহ এনাম

enum MyEnum {
    case normal(myValue: String)
    case cool
}

কিছু মান

let myOptional: MyEnum? = MyEnum.normal("BlaBla")

switch smyOptional {
case .some(.normal(let myValue)) where myValue == "BlaBla":
    // Here because where find in my myValue "BlaBla"
    break

// Example for get value
case .some(.normal(let myValue)):
    break

// Example for just know if is normal case enum
case .some(.normal):
    break

case .none:
    break

default:

    break
}

আপনি উল্লেখ করেছেন ExpressibleByNilLiteralতবে তারপরে এনামের ঘোষণাপত্রগুলিতে প্রকৃতপক্ষে ব্যবহার হয় না এটি কী?
পিকেম্ব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.