فرض التفاف بعد التحقق من عدم وجود شيء؟

2

هل يعتبر ذلك ممارسة سيئة؟

أنا أتحقق مما إذا كان المصفوفة لا شيء ، ثم فرض التلف لاسترداد عنصر من المصفوفة. أفعل هذا لتجنب إنشاء متغير غير ضروري إذا ترك المتغير.

if self.arrayOfStrings != nil{
    textLabel.text = self.arrayOfStrings![0]
}

2 الاجابة

4
افضل جواب

نعم ، إنها ممارسة سيئة. ربما ليس في هذه الحالة على وجه التحديد ولكن من الممكن أن تقوم بعض سلاسل الرسائل الأخرى بتحديث الخاصية وتجعلها معدومة بين التحقق من سلسلة المحادثات هذه nil ومن ثم فك القوة.

فقط قم بما يلي:

if let arrayOfStrings = self.arrayOfStrings {
    textLabel.text = arrayOfStrings[0]
}

لا يوجد متغير غير ضروري هنا لأنك بالفعل تستخدم المتغير داخل if let .

بالطبع في هذه الحالة المحددة للغاية لمحاولة الحصول على القيمة الأولى لصفيف اختياري ، يمكنك ببساطة القيام بما يلي:

textLabel.text = self.arrayOfStrings?.first

إذا كنت تريد شيئًا غير الفهرس 0 فعليك التحقق من الفهرس:

if let arrayOfStrings = self.arrayOfStrings, someIndex < arrayOfStrings.count {
    textLabel.text = arrayOfStrings[someIndex]
}

في أي من هذه الحالات ، يكون المتغير "الإضافي" مضيعة للجهد أو الذاكرة. يتم استخدامه بسعة للقراءة فقط كثابت و Swift ذكي بما يكفي لعدم إنشاء نسخة كاملة من الصفيف في العملية.

:مؤلف
2
افضل جواب

Is it considered bad practice to do this

if self.arrayOfStrings != nil{
    textLabel.text = self.arrayOfStrings![0]
}

ليست ممارسة سيئة ، وأنا أفعل ذلك في بعض الأحيان ؛ لكنها غير ضرورية وغير عادية بعض الشيء ، لأن هذا هو الوضع الذي يقصد بحل الارتباطات المشروطة.

I am checking if the array is nil, then force unwrapping to retrieve an element from the array. I am doing this to avoid creating an unnecessary if let variable.

"إنشاء if let متغير "ليست" غير ضروري "، وهي طريقة أنيقة للتعامل مع هذا ما كنت تقترح القيام به هو ما هو" غير ضرورية "(وهذا هو الإسراف لأنك مقنعة وقت التشغيل للوصول إلى self.arrayOfStrings مرتين).

لديك خياران ، اعتمادًا على ما إذا كان كل شيء يجب أن يتوقف إذا arrayOfStrings يكون nil .

يمكنك وضع حارس:

guard let arr = self.arrayOfStrings else {return}
textLabel.text = arr[0]

أو يمكنك استخدام ربط مشروط:

if let arr = self.arrayOfStrings {
    textLabel.text = arr[0]
}

الفرق (باستثناء الخروج المبكر) هو نطاق arr .

لذا ، على الرغم من أن هذه مسألة رأي إلى حد ما ، أود أن أقول أن المشكلة هنا تكمن في إحساسك بما هو أنيق.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام