কীভাবে সমাধান করবেন "স্ট্রিং ইন্টারপোলেশন একটি alচ্ছিক মানের জন্য একটি ডিবাগ বিবরণ উত্পাদন করে; আপনি কি এই স্পষ্ট করে বলতে চাইছেন? " এক্সকোড 8.3 বিটাতে?


89

বিটা ৮.৩ থেকে, লক্ষ লক্ষ সতর্কতা "স্ট্রিং অন্তরঙ্গকরণ একটি alচ্ছিক মানের জন্য একটি ডিবাগ বিবরণ উত্পন্ন করে; আপনার এটিকে সুস্পষ্ট করার অর্থ কি?" আমার কোড হাজির।

উদাহরণস্বরূপ, সতর্কতা নিম্নলিখিত পরিস্থিতিতে আপ পপ আপ, যেখানে বিকল্পগুলি শূন্য করতে পারে:

let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"

পূর্বে ডিজাইন হিসাবে, এটি আমার (এবং সংকলক) বিকল্পগুলি 'শূন্য' হিসাবে ইন্টারপোল্ট করা ঠিক ছিল। কিন্তু সংকলক এর মন পরিবর্তন করেছে।

সংকলকটি যা পরামর্শ দেয় তা হ'ল বর্ণনা সহ একটি স্ট্রিং কনস্ট্রাক্টর যুক্ত করুন:

let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"

স্পষ্টতই, ফলাফলগুলি সুস্পষ্ট তবে আমার মতে খুব জটিল। একটি ভালো বিকল্প আছে কি? আমাকে কি সেই সমস্ত সতর্কতা ঠিক করতে হবে বা পরবর্তী বিটার জন্য আরও ভাল অপেক্ষা করতে হবে?

বর্ণনার জন্য স্ক্রিনশট


28
কি সত্যিই বিরক্তিকর সতর্কতা ...
জনি

Swift 3আমার নিজেরটি ভেঙে গেছে logএবং আমি কেবল printপরিবর্তে ব্যবহার করে ভুল করেছি । সর্বদা আপনার নিজের মোড়ক তৈরি করা উচিত অন্যথায় আপনি এই ধরণের "নতুন বৈশিষ্ট্য" দ্বারা বিভ্রান্ত হবেন।
superarts.org

উত্তর:


107

এটি এমন একটি পরিবর্তন যা এই টান অনুরোধেOptional(...) ফলস্বরূপ স্ট্রিংয়ে অন্তরঙ্গকরণ প্রায়শই অনাকাঙ্ক্ষিত হওয়ার কারণে ঘটেছিল এবং স্পষ্টতই মোড়কযুক্ত বিকল্পগুলির ক্ষেত্রে বিশেষত অবাক হতে পারে । আপনি এখানে মেলিং তালিকায় এই পরিবর্তনের সম্পূর্ণ আলোচনা দেখতে পাবেন ।

যেমন টান অনুরোধ আলোচনায় উল্লিখিত হয়েছে (যদিও দুর্ভাগ্যক্রমে এক্সকোড দ্বারা নয়) - সতর্কবার্তাটি ব্যবহারের চেয়ে নীরব করার একটি সামান্য সুন্দর উপায় String(describing:)হ'ল আপনি যা যা ইন্টারপোল্ট করছেন তার alচ্ছিক ধরণের একটি কাস্ট যুক্ত করা, উদাহরণস্বরূপ:

var i: Int? = 5
var d: Double? = nil

print("description of i: \(i as Int?)")    // description of i: Optional(5)
print("description of d: \(d as Double?)") // description of d: nil

যা এটিকে সাধারণীকরণ করা যায় as Optional:

print("description of i: \(i as Optional)") // description of i: Optional(5)
print("description of d: \(d as Optional)") // description of d: nil

এসই -0228 দ্বারা প্রবর্তিত নতুন স্ট্রিং ইন্টারপোলেশন সিস্টেমের সাথে সুইফ্ট 5 -এ , অন্য একটি বিকল্পের জন্য কাস্টম appendInterpolationওভারলোড যুক্ত করা DefaultStringInterpolation:

extension DefaultStringInterpolation {
  mutating func appendInterpolation<T>(optional: T?) {
    appendInterpolation(String(describing: optional))
  }
}

var i: Int? = 5
var d: Double? = nil

print("description of i: \(optional: i)") // description of i: Optional(5)
print("description of d: \(optional: d)") // description of d: nil

এবং, যদি ইচ্ছা হয়, আপনি এমনকি মডিউলটির মধ্যে (বা কোনও নির্দিষ্ট ফাইলের মধ্যে চিহ্নিত হিসাবে চিহ্নিত করেন fileprivate) পুরোপুরি সতর্কতাটি অক্ষম করতে আর্গুমেন্ট লেবেলটি সরিয়ে ফেলতে পারেন :

extension DefaultStringInterpolation {
  mutating func appendInterpolation<T>(_ optional: T?) {
    appendInterpolation(String(describing: optional))
  }
}

var i: Int? = 5
var d: Double? = nil

print("description of i: \(i)") // description of i: Optional(5)
print("description of d: \(d)") // description of d: nil

যদিও ব্যক্তিগতভাবে আমি যুক্তির লেবেল রাখতে পছন্দ করি।


প্রস্তাব থেকে, এই পরিবর্তন স্থায়ী হতে যাচ্ছে কিনা তা পরিষ্কার নয় আপনি কি মনে করেন? @ হামিশ
স্টাফেন ডি লুকা

@ স্টাফেনডিউলুকা অন্যান্য সমাধান সম্পর্কে যেমন মেইলিং লিস্টে বেশ কিছুটা আলোচনা হয়েছিল, যেমন ?? "nil"সতর্কবার্তাটি নীরব করে দেওয়ার জন্য অনুমতি দেওয়া হয়েছিল যা হালকা জনপ্রিয় বলে মনে হয়েছিল, তাই অদূর ভবিষ্যতে অন্য কোনও প্রস্তাবতে এটি প্রদর্শিত হতে পারে। আমি একমত যে এই কর্মক্ষেত্রটি আদর্শের চেয়ে কম নয় - ব্যক্তিগতভাবে, আমি মনে করি এটি Optional(...)শক্তিশালী forচ্ছিকের জন্য স্ট্রিংয়ের মধ্যে বিভক্ত হওয়ার প্রত্যাশা করা বরং সুস্পষ্ট - এটি কেবলমাত্র আইইও-র ক্ষেত্রেই ছিল যা এই সতর্কতা আইএমওর প্রয়োজন ছিল। তবে সুইফট অবিচ্ছিন্নভাবে বিকশিত হচ্ছে, সুতরাং লাইনটির নীচে পরে এটি সমস্ত পরিবর্তন হতে পারে। তবে আপাতত, আমরা যা পেয়েছি তা এটাই।
হামিশ

আমি কিছুটা 'সম্পর্কিত' বিষয়টিতে হোঁচট খেয়েছি যদি এখানে আর আনবক্সিং না করা হয় এখানে stackoverflow.com/questions/42543512/… আপনি যদি দেখতে পারেন তবে? @ হামিশ
স্টাফেন ডি লুকা

... যে কোনও ক্ষেত্রে এই কোডটি পাগলতা:guard result == nil else { print("result was \(result as Optional)") return }
13:59 এ লরেটোপরিসিটি

4
@loretoparisi কেন ব্যবহার করবেন if let? অর্থাত if let result = result { print("result was \(result)"); return }। সমস্ত প্রারম্ভিক রিটার্ন গার্ডদের দিয়ে করা প্রয়োজন হয় না।
হামিশ

28

এই সমস্যাটি মোকাবেলার দুটি সহজ উপায়।

বিকল্প 1:

প্রথমটি হ'ল "জোরপূর্বক-আন-র্যাপিং" দ্বারা যে মানটি আপনি ঠুং ঠুং শব্দ (!) ব্যবহার করে ফিরতে চান

var someValue: Int? = 5
print(someValue!)

আউটপুট:

5

বিকল্প 2:

অন্য উপায়, যা আরও ভাল উপায় হতে পারে - হ'ল "নিরাপদে-মোড়ক" আপনি যে মানটি ফিরে পেতে চান।

var someValue: Int? = 5

if let newValue = someValue {
    print(newValue)
}

আউটপুট:

5

বিকল্প 2 দিয়ে যাওয়ার পরামর্শ দিন।

টিপ: জোর করে মোড়ানো (!) এড়িয়ে চলুন যেখানে সম্ভব যেখানে আমরা নিশ্চিত না যে আমাদের কাছে সর্বদা মোড়কানোর মান থাকবে কিনা।


4
আমি নতুন তবে আমি মুদ্রণের আগে মোড়কে বৈধ করার বিকল্পটি 2 পছন্দ করি এবং এটি মোড়ানো না থাকলে আপনার কাছে সর্বদা অন্য কিছু মুদ্রণের বিকল্প থাকে
আবুতারেক

আপনি যদি এটিকে গুরুত্ব সহকারে নিতে চান তবে জোর করে আন-র্যাপিং করা কোনও NO-GO। আমি বলতে চাইছি আপনি অ্যাপটি ক্র্যাশ হওয়ার ঝুঁকিতে পড়ে এমন কিছু মুদ্রণ কনসোল করতে চান কেন? খুব খারাপ পরামর্শ দেয়। বিকল্প 2 ঠিক আছে, আমি 2ht "টিপ" যথেষ্ট না বলে মনে করি, পরিবর্তন পরিবর্তন করুন!
মার্টিন ম্লোস্তেক

16

স্ট্রিং (বর্ণনা: alচ্ছিক) ব্যবহার করা সহজ বলে মনে হচ্ছে।

ডিফল্ট মান ?? অ স্ট্রিং যেমন ইন্টের জন্য কোনও অর্থ দেয় না
যদি ইন্ট শূন্য থাকে তবে আপনি চাইবেন লগটি 'শূন্য' প্রদর্শন করতে অন্য কোনও পূর্বনির্ধারিত উদাহরণস্বরূপ 0 নয়।

পরীক্ষার জন্য কিছু খেলার মাঠের কোড:

var optionalString : String? = nil
var optionalInt : Int? = nil

var description_ = ""
description_ = description_ + "optionalString: \(String(describing: optionalString))\r"
description_ = description_ + "   optionalInt: \(String(describing: optionalInt))\r"

print(description_)

আউটপুট

optionalString: nil
optionalInt: nil

13

এক্সকোড ৮.৩-এ আপডেট করার পরে এবং প্রচুর সতর্কতা বার্তা পাওয়ার পরে, আমি নিম্নলিখিতটি নিয়ে এসেছি যা মূল আউটপুট আচরণের মতো, যুক্ত করা সহজ, কোড এবং আউটপুট উভয়ই "স্ট্রিং (বর্ণন :)" ব্যবহারের শব্দচোষকে হ্রাস করে ।

মূলত, একটি ptionচ্ছিক এক্সটেনশন যুক্ত করুন যা স্ট্রিংকে alচ্ছিকরূপে জিনিসটি বর্ণনা করে বা সেট না করে কেবল "শূন্য" দেয়। এছাড়াও, theচ্ছিক জিনিসটি যদি স্ট্রিং হয় তবে এটিকে উদ্ধৃতিতে রাখুন।

extension Optional {
    var orNil : String {
        if self == nil {
            return "nil"
        }
        if "\(Wrapped.self)" == "String" {
            return "\"\(self!)\""
        }
        return "\(self!)"
    }
}

এবং খেলার মাঠে ব্যবহার:

var s : String?
var i : Int?
var d : Double?

var mixed = "s = \(s.orNil)    i = \(i.orNil)   d = \(d.orNil)" // "s = nil    i = nil   d = nil"

d = 3
i = 5
s = ""
mixed = "s = \(s.orNil)    i = \(i.orNil)   d = \(d.orNil)" // "s = ""    i = 5   d = 3.0"

s = "Test"
d = nil
mixed = "s = \(s.orNil)    i = \(i.orNil)   d = \(d.orNil)" // "s = "Test"    i = 5   d = nil"

নিম্নলিখিত লিঙ্ক থেকে সাহায্যের জন্য ধন্যবাদ:

চেক-যদি-ভেরিয়েবল-এটি-একটি-optionচ্ছিক এবং কী-টাইপ-এটি-মোড়কে দেয়


এই সমাধানটি alচ্ছিক চেইনে কাজ করছে না। ভালো লেগেছে a?.b?.c.orNil
ভিনসেন্ট সিট

11

এটির জন্য ওলে বেগম্যানের সংশোধন দেখুন । আমি এটা ভালোবাসি. এটি একটি ???অপারেটর তৈরি করে যা আপনি এর পরে ব্যবহার করতে পারেন:

var someValue: Int? = 5
print("The value is \(someValue ??? "unknown")")
// → "The value is 5"
someValue = nil
print("The value is \(someValue ??? "unknown")")
// → "The value is unknown"


8

এই সতর্কতা সম্বলিত লাইনে প্রদর্শিত হলুদ ত্রিভুজটিতে ডাবল ক্লিক করুন। এটি দুটি সমাধান সহ ফিক্সআইটি প্রদর্শন করবে ।

স্ক্রিনশট যুক্ত করা হয়েছে

  1. String(describing:)এই সতর্কতাটি নিঃশব্দ করতে ব্যবহার করুন :

    এটি ব্যবহার করে এটি হয়ে যাবে String(describing:<Variable>)

    যেমন :String(describing: employeeName)

  2. default valueএই সতর্কতা এড়ানোর জন্য একটি সরবরাহ করুন :

    এটি ব্যবহার করে এটি হয়ে যাবে (<Variable> ?? default value)

    যেমন: employeeName ?? “Anonymous” as! String


4
হ্যাঁ, আমি নীল-কোলেসিং অপারেটরের জন্যও যাব: ডেভেলপার.এপল.
com

4
দুর্দান্ত উত্তর! যদি আপনার কাছে বিকল্প স্ট্রিং মান সরবরাহের জন্য থাকে তবে নীল-কোলেসিং ভাল কাজ করে
ল্যান্স সামেরিয়া

2

সুইফট 5

আমার সমাধানটি এমন একটি তৈরি করছে extensionযা আপত্তিজনকভাবে Optionalআপত্তি করে Any

আপনি যখন বস্তুটি লগ করেন বা মুদ্রণ করেন তখন আপনি প্রকৃত objectবা <nil>⭕️(পাঠ্য এবং ভিজ্যুয়াল চরিত্রের সংমিশ্রণ) দেখতে পাবেন। এটি দেখার জন্য বিশেষত কনসোল লগটিতে দরকারী।

extension Optional {
    var logable: Any {
        switch self {
        case .none:
            return "<nil>|⭕️"
        case let .some(value):
            return value
        }
    }
}

// sample
var x: Int?
print("Logging optional without warning: \(x.logable)")
// → Logging optional without warning: <nil>|⭕️

0

একটি শিরোনাম পদ্ধতি তৈরি করুন যা একটি নামবিহীন প্যারামিটার সহ একটি alচ্ছিক জেনেরিক প্রকার গ্রহণ করে। আপনার সমস্ত বিরক্তিকর সতর্কতা জাদুকরীভাবে অদৃশ্য হয়ে যাবে।

extension DefaultStringInterpolation {
  mutating func appendInterpolation<T>(_ optional: T?) {
    appendInterpolation(String(describing: optional))
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.