সুইফটে ডাউনকাস্টিং বিকল্পগুলি: হিসাবে? টাইপ, বা হিসাবে! টাইপ?


96

সুইফটে নিম্নলিখিতটি দেওয়া হয়েছে:

var optionalString: String?
let dict = NSDictionary()

নিম্নলিখিত দুটি বিবৃতি মধ্যে ব্যবহারিক পার্থক্য কি:

optionalString = dict.objectForKey("SomeKey") as? String

বনাম

optionalString = dict.objectForKey("SomeKey") as! String?

উত্তর:


143

ব্যবহারিক পার্থক্যটি হ'ল:

var optionalString = dict["SomeKey"] as? String

optionalStringটাইপের একটি ভেরিয়েবল হবে String?। অন্তর্নিহিত প্রকারটি যদি অন্য কিছু হয় তবে Stringএটি নির্দোষভাবে কেবল alচ্ছিককে নির্ধারিত করবে nil

var optionalString = dict["SomeKey"] as! String?

এটি বলে, আমি জানি এই জিনিসটি একটি String?। এটিও optionalStringপ্রকারভেদ হওয়ার ফলস্বরূপ String?, তবে অন্তর্নিহিত ধরণটি অন্য কিছু হলে ক্রাশ হবে।

if letStyleচ্ছিকভাবে নিরাপদভাবে মোড়ক দেওয়ার জন্য প্রথম স্টাইলটি ব্যবহার করা হয়:

if let string = dict["SomeKey"] as? String {
    // If I get here, I know that "SomeKey" is a valid key in the dictionary, I correctly
    // identified the type as String, and the value is now unwrapped and ready to use.  In
    // this case "string" has the type "String".
    print(string)
}

প্রথম পদ্ধতিটি কি তখন সবসময় ভাল না? উভয় স্ট্রিংয়ের একটি alচ্ছিক ফেরত দেয়? দেখে মনে হচ্ছে দ্বিতীয় পদ্ধতিটি প্রথমটির মতো একই কাজ করে তবে ডাউনস্ট্রকটি ব্যর্থ হলে ক্র্যাশ হতে পারে। তাহলে কেন একেবারেই ব্যবহার করবেন?
সিকান্দার

6
হ্যাঁ @ সিকান্দার, প্রথমটি সর্বদা ভাল। আমি দ্বিতীয়টি কখনই ব্যবহার করতাম না।
ভ্যাকোয়াম

14

as? Types- মানে ডাউন কাস্টিং প্রক্রিয়াটি isচ্ছিক। প্রক্রিয়াটি সফল বা নাও হতে পারে (ডাউন কাস্টিং ব্যর্থ হলে সিস্টেম শূন্য করবে) downালাই castালাই ব্যর্থ হলে যে কোনও উপায়ে ক্রাশ হবে না।

as! Type?- এখানে ডাউন কাস্টিংয়ের প্রক্রিয়া সফল হওয়া উচিত (এটি !নির্দেশ করে)। শেষের প্রশ্ন চিহ্নটি নির্দেশ করে যে চূড়ান্ত ফলাফল শূন্য হতে পারে কি না।

"!" সম্পর্কিত আরও তথ্য! এবং "?"

আসুন 2 টি মামলা নেওয়া যাক

  1. বিবেচনা:

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell
    

    এখানে আমরা জানি না যে ইউআইটিএবলভিউসেলকে সনাক্তকারী "সেল" দিয়ে সেল কাস্ট করার ফলাফলটি সাফল্য কিনা। যদি ব্যর্থ হয় তবে তা শূন্য হয় (তাই আমরা এখানে ক্রাশ এড়াতে পারি)। এখানে আমরা নীচে দেওয়া হিসাবে করতে পারেন।

    if let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell {
        // If we reached here it means the down casting was successful
    }
    else {
        // unsuccessful down casting
    }
    

    সুতরাং আসুন আমরা এটির মতো এটি মনে রাখি - এর ?অর্থ যদি আমরা নিশ্চিত না যে মান শূন্য হয় কি না (প্রশ্ন চিহ্ন আসে যখন আমরা জিনিসগুলি জানি না)।

  2. এর সাথে বিপরীতে:

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell. 
    

    এখানে আমরা সংকলককে বলি যে ডাউন কাস্টিং সফল হওয়া উচিত। এটি ব্যর্থ হলে সিস্টেমটি ক্রাশ হবে। সুতরাং আমরা !যখন নিশ্চিত যে মানটি শূন্য হয় তখন আমরা দিই ।


11

ভ্যাকোয়ামা কী বলেছেন তা স্পষ্ট করার জন্য, এখানে একটি উদাহরণ ...

সুইফট 3.0:

import UIKit

let str_value:    Any   = String("abc")!
let strOpt_value: Any?  = String("abc")!
let strOpt_nil:   Any?  = (nil as String?)
let int_value:    Any   = Int(1)
let intOpt_value: Any?  = Int(1)
let intOpt_nil:   Any?  = (nil as Int?)

// as String
//str_value     as String // Compile-Time Error: 'Any' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//strOpt_value  as String // Compile-Time Error: 'Any?' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//strOpt_nil    as String // Compile-Time Error: 'Any?' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//int_value     as String // Compile-Time Error: 'Any' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//intOpt_value  as String // Compile-Time Error: 'Any?' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//intOpt_nil    as String // Compile-Time Error: 'Any?' is not convertible to 'String'; did you mean to use 'as!' to force downcast?

// as? String
  str_value     as? String // == "abc"
  strOpt_value  as? String // == "abc"
  strOpt_nil    as? String // == nil
  int_value     as? String // == nil
  intOpt_value  as? String // == nil
  intOpt_nil    as? String // == nil

// as! String
  str_value     as! String // == "abc"
  strOpt_value  as! String // == "abc"
//strOpt_nil    as! String // Run-Time Error: unexpectedly found nil while unwrapping an Optional value.
//int_value     as! String // Run-Time Error: Could not cast value of type 'Swift.Int' to 'Swift.String'.
//intOpt_value  as! String // Run-Time Error: Could not cast value of type 'Swift.Int' to 'Swift.String'.
//intOpt_nil    as! String // Run-Time Error: unexpectedly found nil while unwrapping an Optional value.

// as String?
//str_value     as String? // Compile-Time Error: cannot convert value of type 'Any' to type 'String?' in coercion
//strOpt_value  as String? // Compile-Time Error: 'Any?' is not convertible to 'String?'; did you mean to use 'as!' to force downcast?
//strOpt_nil    as String? // Compile-Time Error: 'Any?' is not convertible to 'String?'; did you mean to use 'as!' to force downcast?
//int_value     as String? // Compile-Time Error: cannot convert value of type 'Any' to type 'String?' in coercion
//intOpt_value  as String? // Compile-Time Error: 'Any?' is not convertible to 'String?'; did you mean to use 'as!' to force downcast?
//intOpt_nil    as String? // Compile-Time Error: 'Any?' is not convertible to 'String?'; did you mean to use 'as!' to force downcast?

// as? String?
//str_value     as? String? // Compile-Time Error: cannot downcast from 'Any' to a more optional type 'String?'
  strOpt_value  as? String? // == "abc"
  strOpt_nil    as? String? // == nil
//int_value     as? String? // Compile-Time Error: cannot downcast from 'Any' to a more optional type 'String?'
  intOpt_value  as? String? // == nil
  intOpt_nil    as? String? // == nil

// as! String?
//str_value     as! String? // Compile-Time Error: cannot downcast from 'Any' to a more optional type 'String?'
  strOpt_value  as! String? // == "abc"
  strOpt_nil    as! String? // == nil
//int_value     as! String? // Compile-Time Error: cannot downcast from 'Any' to a more optional type 'String?'
//intOpt_value  as! String? // Run-Time Error: Could not cast value of type 'Swift.Int' to 'Swift.String'.
  intOpt_nil    as! String? // == nil

// let _ = ... as String
//if let _ = str_value    as String { true } // Compile-Time Error: 'Any' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//if let _ = strOpt_value as String { true } // Compile-Time Error: 'Any?' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//if let _ = strOpt_nil   as String { true } // Compile-Time Error: 'Any?' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//if let _ = int_value    as String { true } // Compile-Time Error: 'Any' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//if let _ = intOpt_value as String { true } // Compile-Time Error: 'Any?' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
//if let _ = intOpt_nil   as String { true } // Compile-Time Error: 'Any?' is not convertible to 'String'; did you mean to use 'as!' to force downcast?

// let _ = ... as? String
if let _ = str_value    as? String { true } // true
if let _ = strOpt_value as? String { true } // true
if let _ = strOpt_nil   as? String { true } // false
if let _ = int_value    as? String { true } // false
if let _ = intOpt_value as? String { true } // false
if let _ = intOpt_nil   as? String { true } // false

// let _ = ... as! String
//if let _ = str_value    as! String { true } // Compile-Time Error: initializer for conditional binding must have Optional type, not 'String'
//if let _ = strOpt_value as! String { true } // Compile-Time Error: initializer for conditional binding must have Optional type, not 'String'
//if let _ = strOpt_nil   as! String { true } // Compile-Time Error: initializer for conditional binding must have Optional type, not 'String'
//if let _ = int_value    as! String { true } // Compile-Time Error: initializer for conditional binding must have Optional type, not 'String'
//if let _ = intOpt_value as! String { true } // Compile-Time Error: initializer for conditional binding must have Optional type, not 'String'
//if let _ = intOpt_nil   as! String { true } // Compile-Time Error: initializer for conditional binding must have Optional type, not 'String'

// let _ = ... as String?
//if let _ = str_value    as String? { true } // Compile-Time Error: cannot convert value of type 'Any' to type 'String?' in coercion
//if let _ = strOpt_value as String? { true } // Compile-Time Error: 'Any?' is not convertible to 'String?'; did you mean to use 'as!' to force downcast?
//if let _ = strOpt_nil   as String? { true } // Compile-Time Error: 'Any?' is not convertible to 'String?'; did you mean to use 'as!' to force downcast?
//if let _ = int_value    as String? { true } // Compile-Time Error: cannot convert value of type 'Any' to type 'String?' in coercion
//if let _ = intOpt_value as String? { true } // Compile-Time Error: 'Any?' is not convertible to 'String?'; did you mean to use 'as!' to force downcast?
//if let _ = intOpt_nil   as String? { true } // Compile-Time Error: 'Any?' is not convertible to 'String?'; did you mean to use 'as!' to force downcast?

// let _ = ... as? String?
//if let _ = str_value    as? String? { true } // Compile-Time Error: cannot downcast from 'Any' to a more optional type 'String?'
  if let _ = strOpt_value as? String? { true } // true
  if let _ = strOpt_nil   as? String? { true } // true
//if let _ = int_value    as? String? { true } // Compile-Time Error: cannot downcast from 'Any' to a more optional type 'String?'
  if let _ = intOpt_value as? String? { true } // false
  if let _ = intOpt_nil   as? String? { true } // true

// let _ = ... as! String?
//if let _ = str_value    as! String? { true } // Compile-Time Error: cannot downcast from 'Any' to a more optional type 'String?'
  if let _ = strOpt_value as! String? { true } // true
  if let _ = strOpt_nil   as! String? { true } // false
//if let _ = int_value    as! String? { true } // Compile-Time Error: cannot downcast from 'Any' to a more optional type 'String?'
//if let _ = intOpt_value as! String? { true } // Run-Time Error: Could not cast value of type 'Swift.Int' to 'Swift.String'.
  if let _ = intOpt_nil   as! String? { true } // false

সুইফট ২.০:

import UIKit

let str:    AnyObject   = String("abc")
let strOpt: AnyObject?  = String("abc")
let strNil: AnyObject?  = (nil as String?)
let int:    AnyObject   = Int(1)
let intOpt: AnyObject?  = Int(1)
let intNil: AnyObject?  = (nil as Int?)

str    as? String // == "abc"
strOpt as? String // == "abc"
strNil as? String // == nil
int    as? String // == nil
intOpt as? String // == nil
intNil as? String // == nil

str    as! String? // Compile-Time Error: Cannot downcast from 'AnyObject' to a more optional type 'String?'
strOpt as! String? // == "abc"
strNil as! String? // == nil
int    as! String? // Compile-Time Error: Cannot downcast from 'AnyObject' to a more optional type 'String?'
intOpt as! String? // Run-Time Error: Could not cast value of type '__NSCFNumber' to 'NSString'
intNil as! String? // == nil

আপনার উদাহরণের জন্য +1 তবে আপনি কি একই উদাহরণ হিসাবে আমাকে ব্যবহার করতে পারেন! এর জায়গায়? ডাউন সেলকাস্ট করার সময় সেল = টেবিল ভিউ.ডেকিউউ রিজেজেবলসেল উইথআইডেন্টিফায়ার ("সেল") হিসাবে হিসাবে! ইউআইটিএবলভিউসেল..আমাকে কী মনে হয়? পর্যাপ্ত ছিল কেন প্রয়োজন হিসাবে!
আনিস পরজুলি 웃

সেল = টেবিলভিউ.ডিউকিউ পুনরায় ব্যবহারযোগ্য সেলওয়াথ আইডেন্টিফায়ার ("সেল") হিসাবে যাক? ইউআইটিএবলভিউসেল - এখানে আমরা জানি না যে ইউআইটিএবলভিউসেলকে সনাক্তকারী "সেল" সহ কক্ষের ডাউন কাস্টিংয়ের ফলাফল শূন্য কিনা। যদি পেরে থাকে তবে এটি শিল ফিরে আসে (তাই আমরা এখানে ক্রাশ এড়াতে পারি)।
জিশনু বালা

আকর্ষণীয়, intNil as! String? // ==nilএকটি ক্র্যাশ কারণ না !!! ???, ঐচ্ছিক <ইন্টারঅ্যাক্টিভ> হিসাবে .None ঐচ্ছিক <স্ট্রিং> .None থেকে ভিন্ন
onmyway133

আপনি হতাশ কেন as?করতে String? কেন আপনি এটিকে হতাশ করবেন না String?? আপনি কেন হতাশ as!হন না String?
মধু

সুইফট 3 এ এই খেলার মাঠটি করার চেষ্টা করছেন, তবে আপনাকে এর Anyপরিবর্তে ব্যবহার করতে হবেAnyObject
হানি

9
  • as আপকাস্টিং এবং ব্রিজড প্রকারে কাস্টিং টাইপ করার জন্য ব্যবহৃত হয়
  • as? নিরাপদ ingালাই জন্য ব্যবহৃত, ব্যর্থ হলে শূন্য ফিরে
  • as! forceালাই বলপূর্বক ব্যবহৃত, ব্যর্থ হলে ক্রাশ

বিঃদ্রঃ:

  • as! rawচ্ছিকভাবে কাঁচা টাইপ নিক্ষেপ করতে পারবেন না

উদাহরণ:

let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)

let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)

উদাহরণ

var age: Int? = nil
var height: Int? = 180

একটি যুক্ত করে ? ডেটা টাইপের সাথে সাথেই আপনি সংকলককে বলবেন যে ভেরিয়েবলটিতে একটি নম্বর থাকতে পারে বা নাও থাকতে পারে। ঝরঝরে! লক্ষ্য করুন যে এটি Oচ্ছিক ধ্রুবকগুলি সংজ্ঞায়িত করার জন্য সত্যই অর্থবোধ করে না - আপনি কেবল একবারই তাদের মান নির্ধারণ করতে পারেন এবং তাই আপনি তাদের মান শূন্য হবে কিনা তা বলতে সক্ষম হবেন।

আমাদের কখন ব্যবহার করা উচিত? এবং কখন "!"

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

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

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

var navigationController: UINavigationController? { get }

সুতরাং আসুন আমাদের ব্যবহার ক্ষেত্রে ফিরে যান। যদি আপনি এই সত্যের জন্য জানেন যে আপনার ভিউ কন্ট্রোলারের সর্বদা একটি নেভিগেশন কন্ট্রোলার থাকবে তবে আপনি এগিয়ে যেতে এবং এটিকে জড়ো করে জোর করতে পারেন:

controller.navigationController!.pushViewController(myViewController, animated: true)

আপনি যখন একটি রাখা! সম্পত্তি সংখ্যার পিছনে আপনি সংকলককে বলুন আমি এই সম্পত্তিটি alচ্ছিক তা বিবেচনা করি না, আমি জানি যে এই কোডটি যখন কার্যকর করা হয় তখন সর্বদা একটি মূল্য স্টোর থাকবে তাই এই ptionচ্ছিকটিকে একটি সাধারণ ডেটাটাইপের মতো আচরণ করুন। আচ্ছা ভাল না? যদি আপনার ভিউ কন্ট্রোলারে কোনও নেভিগেশন কন্ট্রোলার না থাকে তবে কী হবে? আপনি যদি পরামর্শ দেন যে সর্বদা নেভিগেশনতে কোনও মান সঞ্চিত থাকবে তবে নিয়ন্ত্রণকারী ভুল ছিল? আপনার অ্যাপ্লিকেশন ক্রাশ হবে। যে হিসাবে সহজ এবং কুরুচিপূর্ণ।

সুতরাং, ব্যবহার! আপনি যদি 101% নিশ্চিত হন তবে এটি নিরাপদ।

আপনি যদি নিশ্চিত না হন যে সর্বদা একটি নেভিগেশন নিয়ামক থাকবে? তাহলে আপনি ব্যবহার করতে পারেন? পরিবর্তে একটি!

controller.navigationController?.pushViewController(myViewController, animated: true)

কি? সম্পত্তির নামের পিছনে সংকলকটি বলে যে আমি জানি না যে এই সম্পত্তিটিতে শূন্য বা একটি মান রয়েছে কিনা তাই: যদি এর মান থাকে তবে এটি ব্যবহার করতে পারে এবং সঠিকভাবে পুরো ভাবটি শূন্য বিবেচনা করে। কার্যকরভাবে? কোনও নেভিগেশন নিয়ামক আছে ঠিক সেই ক্ষেত্রে আপনাকে সেই সম্পত্তিটি ব্যবহার করতে দেয়। কোনও ধরণের বা কোনও ধরণের কাস্টিংয়ের চেক না থাকলে। আপনি যখন নেভিগেশন কন্ট্রোলার রাখবেন কি না সেদিকে খেয়াল রাখবেন না এবং কেবল সেখানে থাকলেই কিছু করতে চান যখন এই বাক্য গঠনটি নিখুঁত।

Fantageek যাও বিশাল ধন্যবাদ


8

এগুলি সুইফটে ডাউন কাস্টিংয়ের দুটি ভিন্ন রূপ ।

( as?) , যা শর্তসাপেক্ষ ফর্ম বলে জানা যায় , আপনি যে ধরণের ডাউনকাস্ট করতে চেষ্টা করছেন তার একটি alচ্ছিক মান প্রদান করে।

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


( as!) , যা জোরপূর্বক ফর্ম বলে জানা যায় , একক যৌগিক ক্রিয়া হিসাবে ফলাফলকে জোর করে চাপিয়ে দেয় এবং চাপ প্রয়োগ করে un

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

আরও বিশদের জন্য, দয়া করে অ্যাপলের ডকুমেন্টেশনের টাইপ কাস্টিং বিভাগটি দেখুন।


4

হতে পারে এই কোড উদাহরণটি কাউকে নীতিটি ছাঁটাইতে সহায়তা করবে:

var dict = [Int:Any]()
dict[1] = 15

let x = dict[1] as? String
print(x) // nil because dict[1] is an Int

dict[2] = "Yo"

let z = dict[2] as! String?
print(z) // optional("Yo")
let zz = dict[1] as! String // crashes because a forced downcast fails


let m = dict[3] as! String?
print(m) // nil. the forced downcast succeeds, but dict[3] has no value

এছাড়াও, যাক z2 = ডিক্ট [2] হিসাবে! স্ট্রিং // "ইয়ো" (not
জয়

0

প্রথমটি হ'ল "শর্তসাপেক্ষ নিক্ষেপ" (আমি যে ডকুমেন্টেশনে লিঙ্ক করেছি তাতে "টাইপ-কাস্টিং অপারেটর" এর নিচে দেখুন) । কাস্ট সফল হলে, অভিব্যক্তির মানটি একটি alচ্ছিকভাবে আবৃত হয় এবং ফিরে আসে, অন্যথায় প্রত্যাবর্তিত মান শূন্য হয়।

দ্বিতীয়টির অর্থ optionচ্ছিক স্ট্রিং একটি স্ট্রিং অবজেক্ট হতে পারে বা এটি শূন্য হতে পারে।

এই সম্পর্কিত প্রশ্নে আরও তথ্য পাওয়া যায়


0

সুইফটে এই অপারেটরগুলির জন্য প্যাটার্নটি মনে রাখা সবচেয়ে সহজ হতে পারে: !বোঝায় "এটি সম্ভবত আটকা পড়বে " while? ইঙ্গিত দেয় "এটি শূন্য হতে পারে।"

দেখুন: https://developer.apple.com/swift/blog/?id=23


-1

আমি সুইফ্টের কাছে নবী এবং আমি এই বিকল্পটি লিখতে চেষ্টা করছি কারণ আমি 'বিকল্পগুলি' সম্পর্কে বুঝতে পারি explain আমি ভুল হলে আমাকে সংশোধন করুন।

ধন্যবাদ


class Optional {

    var lName:AnyObject! = "1"

    var lastName:String!
}

let obj = Optional()

print(obj.lName)

print(obj.lName!)

obj.lastName = obj.lName as? String

print(obj.lastName)

(1): obj.lastName = obj.lName as! String

বনাম

(2): obj.lastName = obj.lName as? String

উত্তর: (1) এখানে প্রোগ্রামার হ'ল নিশ্চিত যে “obj.lName”এতে স্ট্রিং টাইপ অবজেক্ট রয়েছে। সুতরাং শুধু যে মান দিতে “obj.lastName”

এখন, যদি প্রোগ্রামারটি সঠিক মানে "obj.lName"হ'ল স্ট্রিং টাইপ অবজেক্ট, তবে কোনও সমস্যা নেই। "obj.lastName" একই মান সেট করবে।

প্রোগ্রামার যদি ভুল উপায় হয় "obj.lName" স্ট্রিং টাইপ অবজেক্ট না হয় অর্থাৎ এটিতে কিছু অন্যান্য টাইপ অবজেক্ট যেমন "এনএসএনম্বার" ইত্যাদি থাকে তবে ক্র্যাশ (রান টাইম ত্রুটি)।

(২) প্রোগ্রামার নিশ্চিত নয় যে “obj.lName”এতে স্ট্রিং টাইপ অবজেক্ট বা অন্য কোনও ধরণের অবজেক্ট রয়েছে। সুতরাং মানটি সেট করুন “obj.lastName”যদি এটি স্ট্রিং টাইপ হয়।

এখন, যদি প্রোগ্রামারটি সঠিক মানে “obj.lName”স্ট্রিং টাইপ অবজেক্ট হয়, তবে কোনও সমস্যা নেই। “obj.lastName”একই মান সেট করা হবে।

তবে যদি প্রোগ্রামারটি ভুল হয় তবে obj.lName স্ট্রিং টাইপ অবজেক্ট নয় ie যেমন এটিতে অন্য কোনও ধরণের অবজেক্ট থাকে "NSNumber"ইত্যাদি ইত্যাদি “obj.lastName”নীল মানকে সেট করবে। সুতরাং, কোনও ক্র্যাশ নেই (শুভ :)

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