সুইফটে একটি ptionচ্ছিকের জন্য একটি ডিফল্ট মান সরবরাহ করছেন?


141

সুইফটে বিকল্পগুলির সাথে ডিল করার জন্য যে প্রতিমাটি ব্যবহার করা হচ্ছে তা অত্যধিক ভারবস বলে মনে হচ্ছে, আপনি যা করতে চান তা যদি কোনও ক্ষেত্রেই ডিফল্ট মান সরবরাহ করে তবে:

if let value = optionalValue {
    // do something with 'value'
} else {
    // do the same thing with your default value
}

যার অকারণে নকল কোড জড়িত, বা

var unwrappedValue
if let value = optionalValue {
    unwrappedValue = value
} else {
    unwrappedValue = defaultValue
}

যার জন্য unwrappedValueধ্রুবক হওয়া দরকার না।

স্কালার অপশন মনড (যা মূলত সুইফটের Oচ্ছিকর মত একই ধারণা) এর getOrElseজন্য এই পদ্ধতি রয়েছে :

val myValue = optionalValue.getOrElse(defaultValue)

আমি কিছু অনুপস্থিত করছি? সুইফট এর ইতিমধ্যে এটি করার কোনও কমপ্যাক্ট উপায় আছে? বা, এটি ব্যর্থ হয়ে ,চ্ছিকের getOrElseজন্য কোনও এক্সটেনশনে সংজ্ঞায়িত করা কি সম্ভব ?


উত্তর:


289

হালনাগাদ

অ্যাপল এখন একটি কোয়েলেসিং অপারেটর যুক্ত করেছে:

var unwrappedValue = optionalValue ?? defaultValue

এই ক্ষেত্রে টেরিনারি অপারেটর আপনার বন্ধু

var unwrappedValue = optionalValue ? optionalValue! : defaultValue

Theচ্ছিক এনামের জন্য আপনি নিজের এক্সটেনশনটি সরবরাহ করতে পারেন:

extension Optional {
    func or(defaultValue: T) -> T {
        switch(self) {
            case .None:
                return defaultValue
            case .Some(let value):
                return value
        }
    }
}

তারপরে আপনি ঠিক করতে পারেন:

optionalValue.or(defaultValue)

তবে, আমি টার্নারি অপারেটরের সাথে লেগে থাকার পরামর্শ দিচ্ছি কারণ অন্যান্য বিকাশকারীরা orপদ্ধতিটি তদন্ত না করে আরও দ্রুত বুঝতে পারবেন will

নোট : আমি একটি শুরু মডিউল ভালো সাধারণ সাহায্যকারী যোগ করার জন্য orউপর Optionalদ্রুতগতি করতে।


আমার সংস্থাপক আমাকে দেখায় যে প্রকারটি unwrappedValueএখনও সুইফট ১.২: var unwrappedValue = optionalValue ? optionalValue! : defaultValue( এক্সকোড bet বিটা ৪) এ এই ক্ষেত্রে alচ্ছিক প্রকারের । এই কি পরিবর্তন হয়েছে?
সিম্পলজি

2
আমি আমার সংস্করণে ভুল আমি 6.4 এ আছি সচেতন থাকুন: ??ডিফল্ট টাইপ অনুমিত আচরণ এটি হ'ল এটি একটি alচ্ছিক দেয়, যা আপনি সাধারণত চান না। আপনি পরিবর্তনশীলটিকে অ-alচ্ছিক হিসাবে ঘোষণা করতে পারেন এবং এটি দুর্দান্তভাবে কাজ করে।
সিম্পলজি

29

অগস্ট 2014 হিসাবে সুইফটে কোয়েলসিং অপারেটর রয়েছে (??) যা এটি অনুমতি দেয়। উদাহরণস্বরূপ, একটি alচ্ছিক স্ট্রিং মায়োপশনাল জন্য আপনি লিখতে পারেন:

result = myOptional ?? "n/a"

4

আপনি যদি লিখেছেন:

let result = optionalValue ?? 50

এবং optionalValue != nilতারপর resultহবে optionalখুব এবং আপনি ভবিষ্যতে এটিকে মোড়ক খোলা হবে

তবে আপনি অপারেটর লিখতে পারেন

infix operator ??? { associativity left precedence 140 }

func ???<T>(optLeft:T?, right:T!) -> T!
{
    if let left = optLeft
    {
        return left
    }
    else { return right}
}

এখন তুমি পার:

 let result = optionalValue ??? 50

আর যখন optionalValue != nilতখন resultহতে হবেunwraped


3

নিম্নলিখিতটি কাজ করে বলে মনে হচ্ছে

extension Optional {
    func getOrElse<T>(defaultValue: T) -> T {
        if let value = self? {
            return value as T
        } else {
            return defaultValue
        }
    }
}

তবে cast value as Tালাই করার দরকারটি একটি কুৎসিত হ্যাক। আদর্শভাবে, জোর দেওয়ার একটি উপায় থাকা উচিত যা ptionচ্ছিকের Tমধ্যে থাকা টাইপের মতো। যেমনটি দাঁড়িয়েছে, TgetOrElse এ প্রদত্ত প্যারামিটারের ভিত্তিতে ইনফারেন্সিং সেটগুলি টাইপ করুন এবং তারপরে রানটাইমে ব্যর্থ হয় যদি এটি ptionচ্ছিকর সাথে মেলে না এবং ptionচ্ছিক অ-শূন্য:

let x: Int?

let y = x.getOrElse(1.414) // y inferred as Double, assigned 1.414

let a: Int? = 5

let b: Double = a.getOrElse(3.14) // Runtime failure casting 5 to Double

Tপদ্ধতির জন্য আপনাকে নির্দিষ্ট করার দরকার নেই । এটি আসলে ptionচ্ছিক থেকে বিদ্যমানটিকে ওভাররাইড করে T। আপনি কেবল এটি করতে পারেন: func getOrElse(defaultValue: T) -> Tতারপরে টি
alচ্ছিকের

ধন্যবাদ! আমি আপনার প্রতিক্রিয়া দ্বিতীয়ার্ধ থেকে ঠিক এটি অনুমান করা। জেনেরিক ধরণটি সেই হিসাবে সংজ্ঞায়িত হয়েছে তা জানতে ptionচ্ছিকের সংজ্ঞাটি পরীক্ষা করার কোনও উপায় আছে কি T? (পরলোক কেবল সম্মেলন উপর ভিত্তি করে অভিমানী)
ওয়েস Campaigne

আপনি যদি Optionalএক্সকোডের অভ্যন্তরে কমান্ড-ক্লিক করেন তবে দেখতে পাবেন যে এটি সংজ্ঞায়িত হয়েছেenum Optional<T>
ড্রুয়েগ করুন

ওহ, দুর্দান্ত আমার অনুমান করা উচিত ছিল সেখানে সংজ্ঞাগুলি কার্যকর হবে; এমন অনেক কিছুই আছে যা ডকুমেন্টেশনে নেই। আবার ধন্যবাদ.
ওয়েস ক্যাম্পেইগনে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.