একটি ptionচ্ছিক বুলের মান পরীক্ষা করা হচ্ছে


89

যখন আমি toচ্ছিক বুলটি সত্য কিনা তা পরীক্ষা করতে চাই, এটি করা কার্যকর হয় না:

var boolean : Bool? = false
if boolean{
}

এটি এই ত্রুটির ফলাফল:

@চ্ছিক টাইপ '@ আইভালিউল?' বুলিয়ান হিসাবে ব্যবহার করা যায় না; পরিবর্তে '! = শূন্য' জন্য পরীক্ষা

আমি শূন্য পরীক্ষা করতে চাই না; প্রত্যাশিত মানটি সত্য কিনা তা আমি যাচাই করতে চাই।

আমি if boolean == trueযদি anচ্ছিক বুলের সাথে কাজ করি তবে আমাকে কি সর্বদা করতে হবে ?

অপশনগুলি যেহেতু BooleanTypeআর মেনে চলে না, সংকলকটি কি জানা উচিত নয় যে আমি বুলের মান পরীক্ষা করতে চাই?


যেহেতু বুলিয়ানস সমতুল্য প্রোটোকলের সাথে সামঞ্জস্যপূর্ণ, তাই আপনি একটি alচ্ছিককে একটি অ-alচ্ছিকের সাথে তুলনা করতে পারেন। এখানে
মধু

উত্তর:


197

Alচ্ছিক বুলিয়ানগুলির সাথে এটির চেকটি সুস্পষ্ট করা দরকার:

if boolean == true {
    ...
}

অন্যথায় আপনি alচ্ছিক মোড়ক করতে পারেন:

if boolean! {
    ...
}

তবে এটি বুলিয়ান হলে রানটাইম ব্যতিক্রম উত্পন্ন করে nil- এটি রোধ করতে:

if boolean != nil && boolean! {
    ...
}

বিটা 5 এর আগে এটি সম্ভব ছিল, তবে রিলিজ নোটগুলিতে উল্লিখিত হিসাবে এটি পরিবর্তন করা হয়েছে:

Bচ্ছিক বুল মানগুলির সাথে কাজ করার সময় বিভ্রান্তি এড়াতে বিকল্পগুলির বিকল্পগুলির আর কোনও স্পষ্টভাবে মূল্যায়নের মূল্যায়ন হয় না যখন তাদের মান থাকে না এবং মিথ্যা থাকে না। পরিবর্তে, বিকল্পের কোনও মান রয়েছে কিনা তা জানতে == বা! = অপারেটরগুলির সাথে শূন্যের বিরুদ্ধে একটি স্পষ্ট চেক করুন।

সংযোজন: @ মার্টিনআরের পরামর্শ অনুসারে, তৃতীয় বিকল্পের আরও কমপ্যাক্ট প্রকরণটি কোয়েলসিং অপারেটরটি ব্যবহার করছে:

if boolean ?? false {
    // this code runs only if boolean == true
}

যার অর্থ: যদি বুলিয়ান শূন্য না হয় তবে অভিব্যক্তিটি বুলিয়ান মানকে মূল্যায়ন করে (অর্থাত মোড়কযুক্ত বুলিয়ান মান ব্যবহার করে), অন্যথায় অভিব্যক্তিটি মূল্যায়ন করে false


4
তৃতীয় বিকল্পটি পছন্দসই সমাধান কারণ কোডের অভিপ্রায়টি প্রকাশ করার সেরা উপায় the ব্যবহার if letকরাও কাজ করবে।
সুলতান

29
"নীল কোয়েলসিং অপারেটর ??" ব্যবহার করে তৃতীয় বিকল্পের একটি রূপ if boolean ?? false { ... }
মার্টিন আর

4
তবে যদি আমি এটিকে অবহেলা করতে চাই তবে এটি হাস্যকর দেখা শুরু করে: if !(boolean ?? true) { ... }:(
আন্দ্রেয়াস

4
চূড়ান্তভাবে একটি অত্যন্ত খারাপ ধারণা আনারপ করুন। এটি সর্বদা এড়ানো উচিত।
ম্যাথিউ রিগলার

4
প্রথম বিকল্পটিতে কী ভুল? আমার কাছে এটি সবচেয়ে ভাল উপায় বলে মনে হচ্ছে।
ওয়াহিদ আমিরি

43

.চ্ছিক বাঁধাই

সুইফট 3 এবং 4

var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
    // Executes when booleanValue is not nil and true
    // A new constant "booleanValue: Bool" is defined and set
    print("bound booleanValue: '\(booleanValue)'")
}

সুইফট 2.2

var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
    // Executes when booleanValue is not nil and true
    // A new constant "booleanValue: Bool" is defined and set
    print("bound booleanValue: '\(booleanValue)'")
}

কোডটি যদি থাকে এবং ব্লকটি কার্যকর হয় না let booleanValue = booleanValuereturns যদি তা না হয় তবে এই কোডটি প্রকারের নামে একটি নতুন ভেরিয়েবল সংজ্ঞায়িত করে (বিকল্পের পরিবর্তে )।falsebooleanValuenilifbooleanValuenilbooleanValueBoolBool?

সুইফট 3 এবং 4 কোড booleanValue(এবং স্যুইফ্ট 2.2 কোড where booleanValue) নতুন booleanValue: Boolভেরিয়েবলের মূল্যায়ন করে । যদি এটি সত্য হয় তবে ifব্লকটি booleanValue: Boolস্কোপে নতুন সংজ্ঞায়িত ভেরিয়েবলের সাথে কার্যকর করে (অপশনটিকে ifব্লকের মধ্যে আবার সীমাবদ্ধ মানটি উল্লেখ করার অনুমতি দেয় )।

দ্রষ্টব্য: boundচ্ছিক ধ্রুবক / পরিবর্তনশীল যেমন যেমন সীমাবদ্ধ স্থির / ভেরিয়েবলের নামকরণ করা এটি একটি সুইফট কনভেনশন let booleanValue = booleanValue। এই কৌশলটিকে ভেরিয়েবল শেডিং বলা হয় । আপনি কনভেনশন থেকে বিরতি দিতে এবং এরকম কিছু ব্যবহার করতে পারেন let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue। আমি কী ঘটছে তা বুঝতে সাহায্য করার জন্য এটি নির্দেশ করছি। আমি পরিবর্তনশীল ছায়া গো ব্যবহার করার পরামর্শ দিচ্ছি।

 

অন্যান্য পন্থা

নীল কোলেসেসিং

এই নির্দিষ্ট ক্ষেত্রে নীল কোলেসিং স্পষ্ট

var booleanValue : Bool? = false
if booleanValue ?? false {
    // executes when booleanValue is true
    print("optional booleanValue: '\(booleanValue)'")
}

চেক করা falseততটা পরিষ্কার নয়

var booleanValue : Bool? = false
if !(booleanValue ?? false) {
    // executes when booleanValue is false
    print("optional booleanValue: '\(booleanValue)'")
}

দ্রষ্টব্য: if !booleanValue ?? falseসংকলন করে না।

 

Wচ্ছিকভাবে মোড়ক আনতে হবে (এড়ানো)

জোর করে মোড়ক দেওয়া সম্ভাবনা বাড়িয়ে দেয় যে কেউ ভবিষ্যতে এমন একটি পরিবর্তন আনবে যা সংকলন করলেও রানটাইমের সময় ক্র্যাশ হয়ে যায়। অতএব, আমি এই জাতীয় কিছু এড়াতে চাই:

var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
    // executes when booleanValue is true
    print("optional booleanValue: '\(booleanValue)'")
}

 

একটি সাধারণ পদ্ধতি

যদিও স্ট্যাক ওভারফ্লো প্রশ্ন বিশেষভাবে জিজ্ঞেস করে একটি চেক কিভাবে Bool?হয় trueএকটি মধ্যে ifবিবৃতি, এটা সত্য মিথ্যা বা অন্যান্য এক্সপ্রেশন সঙ্গে মোড়ানো মান মিশ্রন চেক কিনা একটি সাধারণ পদ্ধতির শনাক্ত করতে সহায়ক।

অভিব্যক্তিটি আরও জটিল হয়ে উঠলে, আমি অন্যান্য পদ্ধতির তুলনায় optionচ্ছিক বাঁধাইয়ের পদ্ধতিকে আরও নমনীয় এবং বোঝার পক্ষে সহজ বোধ করি। উল্লেখ্য কোনো ঐচ্ছিক প্রকার (সঙ্গে যে ঐচ্ছিক বাঁধাই কাজ Int?, String?, ইত্যাদি)।


লুপ লুপের জন্য একটি optionচ্ছিক সহ বুলিয়ান এক্সপ্রেশন ব্যবহার করতে আমার অসুবিধা হচ্ছে। নীল কোয়েলেসিং অপারেটর কাজ করে তবে এটি অগোছালো এবং ত্রুটিযুক্ত প্রবণ। কোন উপায় আছে if let?
jbaraga

@ জবারগা, আপনি যখন ভাবছেন তখন লুপটির একটি উদাহরণ পোস্ট করুন।
মোবাইল ড্যান

স্ট্যাক হিসাবে একটি অ্যারে ব্যবহার করার সময়, আমি কোনও শর্ত পূরণ না হওয়া বা স্ট্যাকটি খালি না হওয়া পর্যন্ত মানগুলি পপ অফ করতে চাই। উদাহরণস্বরূপ,while array.last < threshold { array.removeLast() }
jbaraga

আপনি এটি if, let, whereব্যবহার করে সেই স্ট্যাক প্রক্রিয়াজাতকরণটি সম্পন্ন করতে পারেন : while let last = array.last where last < threshold { array.removeLast() }সুইফট 2 বা while let last = array.last, last < threshold { array.removeLast() }সুইফ্ট 3
মোবাইল ড্যান

ধন্যবাদ, এটি আরও ভাল। আমি সচেতন ছিলাম না while let
jbaraga

2
var enabled: Bool? = true

if let enabled = enabled, enabled == true {
    print("when is defined and true at the same moment")
}

if enabled ?? false {
    print("when is defined and true at the same moment")
}

if enabled == .some(true) {
    print("when is defined and true at the same moment")
}

if enabled == (true) {
    print("when is defined and true at the same moment")
}

if case .some(true) = enabled {
    print("when is defined and true at the same moment")
}

if enabled == .some(false) {
    print("when is defined and false at the same moment")
}

if enabled == (false) {
    print("when is defined and false at the same moment")
}

if enabled == .none {
    print("when is not defined")
}

if enabled == nil {
    print("when is not defined")
}

0

আমি আরেকটি সমাধান পেয়েছি, বুলিয়ান অপারেটরদের ওভারলোড করে। উদাহরণ স্বরূপ:

public func < <T: Comparable> (left: T?, right: T) -> Bool {
    if let left = left {
        return left < right
    }
    return false
}

ভাষা পরিবর্তনের "স্পিরিট" এ এটি সম্পূর্ণরূপে নাও হতে পারে, তবে এটি বিকল্পগুলি নিরাপদে আন-র্যাপিংয়ের জন্য অনুমতি দেয় এবং লুপগুলি সহ এটি শর্তাবলীর জন্য যে কোনও জায়গায় ব্যবহারযোগ্য।


4
দুঃখিত, মূল পোস্টটির দিকে ফিরে তাকানো, এটি নির্দিষ্ট প্রশ্নের উত্তর দেয় না, বরং আমার আগের মন্তব্যে উত্থাপিত প্রশ্নটি।
jbaraga

আমি এই ওভারলোডটি ব্যবহারের বিষয়ে খুব সতর্ক থাকব, কারণ এমন কিছু ক্ষেত্রে থাকতে পারে যে আপনি শূন্যকে একটি "নন-নিল" হিসাবে গণ্য করতে চান না (আপনি কিছু নির্দিষ্ট ক্ষেত্রে বিপরীত ফলাফল পেতে পারেন, বা সম্ভবত বিকল্প হিসাবে সম্পূর্ণরূপে হ্যান্ডলিং)। পরিবর্তে সাধারণ আনারপ্যাটিং ব্যবহার আপনাকে প্রতিটি ক্ষেত্রে কীভাবে নীল পরিচালনা করতে চান তা স্পষ্টভাবে সম্বোধন করতে বাধ্য করে, তাই আপনি অপ্রত্যাশিত ফলাফলের দিকে ঝুঁকির সম্ভাবনা কম।
জন মন্টগোমেরি

0

আমি যে উত্তরটি সবচেয়ে সহজে পড়তে পেলাম তা হ'ল কোনও ফাংশন সংজ্ঞায়িত করা। খুব জটিল নয় কাজটি করে।

func isTrue(_ bool: Bool?) -> Bool {
    guard let b = bool else {
        return false
    }
    return b
}

ব্যবহার:

let b: Bool? = true
if isTrue(b) {
    // b exists and is true
} else {
    // b does either not exist or is false
}

0

যেমনটি আন্তোনিও

Bচ্ছিক বুল মানগুলির সাথে কাজ করার সময় বিভ্রান্তি এড়াতে বিকল্পগুলির বিকল্পগুলির আর কোনও স্পষ্টভাবে মূল্যায়নের মূল্যায়ন হয় না যখন তাদের মান থাকে না এবং মিথ্যা থাকে না। পরিবর্তে, বিকল্পের কোনও মান রয়েছে কিনা তা জানতে == বা! = অপারেটরগুলির সাথে শূন্যের বিরুদ্ধে একটি স্পষ্ট চেক করুন।

আমি হোঁচট খেতে গিয়ে কোডের একটি লাইন বুঝতে চেষ্টা করে কয়েক ঘন্টা ব্যয় করেছি, তবে এই থ্রেডটি আমাকে সঠিক পথে ফেলেছে।

এই উদ্ধৃতি আগস্ট ২০১৪ সালের , এবং তখন থেকেই অ্যাপল Neverনিম্নলিখিত প্রস্তাবটি এসই -0102 প্রবর্তন করে এবং পরবর্তীকালে এটি সমতুল্য, হাস্যযোগ্য, ত্রুটি এবং তুলনীয় হিসাবে উপযুক্ত হয়

এখন কোনও বুলিয়ান nilব্যবহার করছে কিনা তা পরীক্ষা করা সম্ভব Never?:


var boolean: Bool? = false
boolean is Never? // false
boolean = true
boolean is Never? // false
boolean = nil
boolean is Never? // true

আপনি প্রকৃতপক্ষে অন্য যে কোনও বাসযোগ্য জায়গা ব্যবহার করতে পারেন :

public enum NeverEver { }
var boolean: Bool? = false
boolean is NeverEver? // false
boolean = true
boolean is NeverEver? // false
boolean = nil
boolean is NeverEver? // true

বলা হচ্ছে, এখন কোনও সম্পত্তি র‌্যাপার ব্যবহার করাও সম্ভব :

@propertyWrapper struct OptionalBool {
    public var wrappedValue: Bool?
    public var projectedValue: Bool { wrappedValue ?? false }
    public init(wrappedValue: Bool?) {
        self.wrappedValue = wrappedValue
    }
}

struct Struct {
    @OptionalBool var predicate: Bool?
    var description: String {
        if $predicate {
            return "predicate is true"
        }
        return "predicate is false"
    }
}

var object = Struct()
object.description // "predicate is false"
object.predicate = false
object.description // "predicate is false"
object.predicate = true
object.description // "predicate is true"

অথবা এমনকি:

@propertyWrapper struct OptionalBool {
    var wrappedValue: Bool?
    var projectedValue: OptionalBool { self }
    var isNil: Bool { wrappedValue is Never? }
    var value: Bool { wrappedValue ?? false }
    
    init(wrappedValue: Bool?) {
        self.wrappedValue = wrappedValue
    }
}

struct Struct {
    @OptionalBool var predicate: Bool?
    var description: String {
        if $predicate.value {
            return "predicate is true"
        }
        if !$predicate.isNil {
            return "predicate is false"
        }
        return "predicate is nil"
    }
}

var object = Struct()
object.description // "predicate is nil"
object.predicate = false
object.description // "predicate is false"
object.predicate = true
object.description // "predicate is true"

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