Tingচ্ছিক চলক মুদ্রণ


118

আমি কোডের এই লাইনগুলি দিয়ে চেষ্টা করছি

class Student {
    var name: String
    var age: Int?

    init(name: String) {
        self.name = name
    }

    func description() -> String {
        return age != nil ? "\(name) is \(age) years old." : "\(name) hides his age."
    }
}

var me = Student(name: "Daniel")
println(me.description())
me.age = 18
println(me.description())

উপরে কোড অনুসরণ হিসাবে উত্পাদন করে

Daniel hides his age.
Daniel is Optional(18) years old.

আমার প্রশ্নটি কেন সেখানে ptionচ্ছিক (18) রয়েছে, আমি কীভাবে alচ্ছিক এবং কেবল মুদ্রণটিকে সরাতে পারি

Daniel is 18 years old.

উত্তর:


190

Understandচ্ছিক আসলে কী তা আপনাকে বুঝতে হবে। অনেক সুইফট আরম্ভকারীরা মনে করেন var age: Int?যে বয়সটি এমন একটি অন্তর্নিহিত যাটির কোনও মূল্য বা নাও থাকতে পারে। তবে এর অর্থ হ'ল বয়স এমন একটি Oচ্ছিক যা কোনও ইন্ট বা ধরে রাখতে পারে।

আপনার description()ফাংশনের অভ্যন্তরে আপনি ইন্ট মুদ্রণ করবেন না, তবে পরিবর্তে আপনি printচ্ছিক মুদ্রণ করবেন। আপনি যদি ইন্টটি প্রিন্ট করতে চান তবে আপনাকে unচ্ছিক আন-র্যাপ করতে হবে। আপনি একটি ptionচ্ছিক আবরণ "alচ্ছিক বাঁধাই" ব্যবহার করতে পারেন:

if let a = age {
 // a is an Int
}

আপনি যদি নিশ্চিত হন যে ptionচ্ছিক কোনও বস্তু ধারণ করে, আপনি "জোর করে আন-র্যাপিং" ব্যবহার করতে পারেন:

let a = age!

বা আপনার উদাহরণে, যেহেতু আপনার কাছে ইতিমধ্যে বর্ণনা ফাংশনটিতে শূন্যের জন্য একটি পরীক্ষা আছে, আপনি কেবল এটি এটিকে পরিবর্তন করতে পারেন:

func description() -> String {
    return age != nil ? "\(name) is \(age!) years old." : "\(name) hides his age."
}

আমি মনে করি উদাহরণটি কিছুটা ভাল হবে যদি আপনি এটি ব্যবহার করে পরিবর্তন করেনif let age = age { return ""} else { return "" }
কুবি

13
জন্য +1:Many Swift beginners think var age: Int? means that age is an Int which may or may not have a value. But it means that age is an Optional which may or may not hold an Int.
লি

18

একটি alচ্ছিক মানে সুইফট পুরোপুরি নিশ্চিত নয় যে মানটি ধরণের সাথে মিলে যায়: উদাহরণস্বরূপ, ইন্ট? এর অর্থ হ'ল সুইফ্টটি পুরোপুরি নিশ্চিত নয় যে সংখ্যাটি কোনও ইন্ট হয় কিনা।

এটিকে সরাতে, এমন তিনটি পদ্ধতি রয়েছে যাতে আপনি নিয়োগ করতে পারেন।

1) আপনি যদি প্রকারের বিষয়ে পুরোপুরি নিশ্চিত হন তবে আপনি এটিকে জোর করে মোছার জন্য বিস্মিত চিহ্নটি ব্যবহার করতে পারেন:

// Here is an optional variable:

var age: Int?

// Here is how you would force unwrap it:

var unwrappedAge = age!

আপনি যদি বাধ্যতামূলকভাবে একটি wচ্ছিক আন-মোড়কে চাপান এবং এটি শূন্যের সমান হয়, আপনি এই ক্র্যাশ ত্রুটির মুখোমুখি হতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

এটি অগত্যা নিরাপদ নয়, সুতরাং এখানে এমন একটি পদ্ধতি রয়েছে যা আপনি ধরণের এবং মান সম্পর্কে নিশ্চিত না হলে ক্রাশ হওয়া রোধ করতে পারে:

এই সমস্যাটির বিরুদ্ধে 2 এবং তিনটি পদ্ধতি রক্ষা করুন।

2) সুস্পষ্টভাবে মোড়কযুক্ত alচ্ছিক

 if let unwrappedAge = age {

 // continue in here

 }

নোট করুন যে মোড়কযুক্ত টাইপটি এখন ইন্টের পরিবর্তে ইন্ট হয়?

3) গার্ড বিবৃতি

 guard let unwrappedAge = age else { 
   // continue in here
 }

এখান থেকে, আপনি এগিয়ে যেতে পারেন এবং মোড়ানো মোড়কটি ব্যবহার করতে পারেন able আপনি যদি ভেরিয়েবলের ধরণের বিষয়ে নিশ্চিত হন তবে কেবল আনার্পিং (একটি দিয়ে!) জোর করে তা নিশ্চিত করুন।

আপনার প্রকল্পের সাথে সৌভাগ্য কামনা করছি!


1
প্রত্যাবর্তন বয়স! = শূন্য? "(নাম) (বয়স!) বছর বয়সী" " : "(নাম) তার বয়স লুকায়।"
25:38

1
আমার যে সমস্যাটি ছিল তা দিয়ে মাথা ব্যথা বাঁচিয়েছি। আপনাকে যথেষ্ট ধন্যবাদ দিতে পারি না
ব্রুনো 9

8

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

অন্য প্রশ্নের এই উত্তরটি পড়ার পরেও আমি বিষয়গুলিতে আরও উন্নতি করেছি ।

fileprivate protocol _Optional {
    func unwrappedString() -> String
}

extension Optional: _Optional {
    fileprivate func unwrappedString() -> String {
        switch self {
        case .some(let wrapped as _Optional): return wrapped.unwrappedString()
        case .some(let wrapped): return String(describing: wrapped)
        case .none: return String(describing: self)
        }
    }
}

postfix operator ~? { }
public postfix func ~? <X> (x: X?) -> String {
    return x.unwrappedString
}

স্পষ্টতই অপারেটর (এবং এর বৈশিষ্ট্যগুলি) আপনার পছন্দ অনুসারে টুইট করা যেতে পারে বা আপনি এর পরিবর্তে এটি একটি ফাংশন করতে পারেন। যাইহোক, এটি আপনাকে এর মতো সাধারণ কোডটি লিখতে সক্ষম করে:

var d: Double? = 12.34
print(d)     // Optional(12.34)
print(d~?)   // 12.34
d = nil
print(d~?)   // nil

অন্য লোকের প্রোটোকল ধারণাটি সংহত করে এটি তৈরি করেছে যাতে এটি এমনকি নেস্টেড বিকল্পগুলির সাথে কাজ করে, যা প্রায়শই optionচ্ছিক চেইন ব্যবহার করার সময় ঘটে। উদাহরণ স্বরূপ:

let i: Int??? = 5
print(i)              // Optional(Optional(Optional(5)))
print("i: \(i~?)")    // i: 5

1
সুইফট 3 হিসাবে আপনি সুইফ্ট স্ট্যান্ডার্ড লাইব্রেরি ফাংশন ডিবাগপ্রিন্ট (_: বিভাজক: টার্মিনেটর :) ব্যবহার করতে পারেন। এটি তবে ডাবল উদ্ধৃতিতে স্ট্রিংটি মুদ্রণ করবে।
PSmythirl

@psmythirl: জেনে রাখা ভাল! তবে কখনও কখনও আপনি কেবল Stringঅন্য কোথাও option চ্ছিক পাস বা এম্বেড করতে চাইতে পারেন (যেমন লগ / ত্রুটির বার্তা)।
জেরেমি

মুদ্রণ (কোনও হিসাবে ডি)
ডনসং

7

হালনাগাদ

সহজভাবে ব্যবহার me.age ?? "Unknown age!"। এটি 3.0.2 এ কাজ করে।

পুরানো উত্তর

জোর করে মোড়ক ছাড়াই (কোনও জাল সিগন্যাল / ক্রাশ যদি শূন্য হয় না) এটি করার আরও একটি দুর্দান্ত উপায় হ'ল:

(result["ip"] ?? "unavailable").description

result["ip"] ?? "unavailable" খুব কাজ করা উচিত, তবে এটি কমপক্ষে ২.২-এ নয়

অবশ্যই, আপনার উপযুক্ত অনুসারে "অনুপলব্ধ" প্রতিস্থাপন করুন: "শূন্য", "পাওয়া যায় না" ইত্যাদি


4

age!পরিবর্তে alচ্ছিক ব্যবহার মোড়ক করতে age। বর্তমানে আপনার মুদ্রণগুলি optionচ্ছিক মান হতে পারে nil। এজন্যই এটা দিয়ে আবৃত Optional


4

দ্রুত Optionalপরিবর্তন এমন কিছু বিষয় যা nilকিছু ক্ষেত্রে হতে পারে । আপনি 100% নিশ্চিত যে একটি হন variableকিছু মান সবসময় থাকবে এবং ফিরবে না nilঅ্যাড !পরিবর্তনশীল এটা মোড়ক খোলা বলপূর্বক সঙ্গে।

অন্য ক্ষেত্রে যদি আপনি মান সম্পর্কে খুব নিশ্চিত না হন তবে একটি if letব্লক যুক্ত করুন বা guardনিশ্চিত করুন যে সেই মানটি বিদ্যমান আছে তা না হলে এটি ক্রাশের কারণ হতে পারে।

জন্য if letব্লক:

if let abc = any_variable {
 // do anything you want with 'abc' variable no need to force unwrap now.
}

জন্য guardবিবৃতি:

guard শর্ত পূরণ না হলে নিয়ন্ত্রণ ফিরিয়ে আনতে শর্তযুক্ত কাঠামো।

আমি অনেক পরিস্থিতিতে ব্লক guardওভার if letব্লক ব্যবহার করতে পছন্দ করি কারণ এটি functionযদি নির্দিষ্ট মানের অস্তিত্ব না রাখে তবে এটি আমাদের ফিরিয়ে দিতে দেয়। যেমন যখন কোনও ফাংশন থাকে যেখানে কোনও ভেরিয়েবলের অস্তিত্বের অবিচ্ছেদ্য থাকে, আমরা গার্ড স্টেটমেন্টে এটি পরীক্ষা করতে পারি এবং এটির ফেরত পাওয়া যায় না। অর্থাত;

guard let abc = any_variable else { return }

আমরা যদি ভেরিয়েবলের উপস্থিত থাকে আমরা গার্ড স্কোপের বাইরে ফাংশনে 'abc' ব্যবহার করতে পারি।


3

agealচ্ছিক প্রকার: Optional<Int>সুতরাং আপনি যদি এটি শূন্যের সাথে তুলনা করেন তবে এটির মান রয়েছে বা না থাকলে এটি প্রতিবারই মিথ্যা প্রত্যাবর্তন করে। মান পেতে আপনাকে alচ্ছিক আনারপ করা দরকার।

আপনার উদাহরণে আপনি জানেন না এটির কোনও মূল্য রয়েছে তাই আপনি পরিবর্তে এটি ব্যবহার করতে পারেন:

if let myAge = age {
    // there is a value and it's currently undraped and is stored in a constant
}
else {
   // no value
}

3

আমি অন্য ভিউ কন্ট্রোলার থেকে স্ট্রিংয়ের (সম্পত্তি) মানটি মুদ্রণ করতে এটি করেছি।

ViewController.swift

var testString:NSString = "I am iOS Developer"

SecondViewController.swift

var obj:ViewController? = ViewController(nibName: "ViewController", bundle: nil)
print("The Value of String is \(obj!.testString)")

ফলাফল :

The Value of String is I am iOS Developer

2
আপনি একটি ঐচ্ছিক মোড়ক খোলা বাধ্য করা উচিত নয়
ই-Riddie

3

পরীক্ষা করে দেখুন guardবিবৃতি:

for student in class {
    guard let age = student.age else { 
        continue 
     }
    // do something with age
}

3

যখন একটি ডিফল্ট মান থাকে:

print("\(name) is \(age ?? 0) years old")

বা নামটি যখন alচ্ছিক হয়:

print("\(name ?? "unknown") is \(age) years old")


1

আমি আমার টেবিলভিউ সেলগুলিতে ptionচ্ছিক ("স্ট্রিং") পাচ্ছিলাম।

প্রথম উত্তরটি দুর্দান্ত। এবং আমাকে এটি নির্ণয় করতে সহায়তা করেছে। আমার মত দুষ্টুদের এখানে সাহায্য করার জন্য আমি এখানে যা করেছি।

যেহেতু আমি আমার কাস্টম অবজেক্টে একটি অ্যারে তৈরি করছি, আমি জানি যে এটিতে সর্বদা প্রথম অবস্থানে আইটেম থাকবে, তাই আমি এটিকে জোর করে অন্য ভেরিয়েবলের মধ্যে জোর করতে পারি। তারপরে মুদ্রণ করতে সেই পরিবর্তনশীলটি ব্যবহার করুন বা আমার ক্ষেত্রে টেবিলভিউ সেল পাঠ্যে সেট করুন।

let description = workout.listOfStrings.first!
cell.textLabel?.text = description

এখন খুব সহজ মনে হচ্ছে, তবে এটি বের করতে আমাকে কিছুটা সময় নিয়েছে।


-1

এটি এই প্রশ্নের সঠিক উত্তর নয়, তবে এই ধরণের সমস্যার এক কারণ। আমার ক্ষেত্রে আমি স্ট্রিং থেকে ifচ্ছিককে "যদি যাই" এবং "গার্ড লেট" দিয়ে সরিয়ে দিতে সক্ষম হইনি।

তাই ব্যবহার AnyObject পরিবর্তে কোন দ্রুতগতি মধ্যে একটি স্ট্রিং থেকে ঐচ্ছিক মুছে ফেলার জন্য।

উত্তরের জন্য লিঙ্ক উল্লেখ করুন।

https://stackoverflow.com/a/51356716/8334818

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