المنتديات

عامل تشغيل Mac الثنائي '>' لا يمكن تطبيقه على معاملات من النوع 'مزدوج؟' و 'Int'

abcdefg12345

ملصق أصلي
10 يوليو 2013
  • 21 أكتوبر 2017
أنا أحاول الحصول على عبارة if للتحقق مما إذا كانت القيمة المزدوجة في سلسلة أكبر من 10 ولكني حريص على الحصول على خطأ 'عامل التشغيل الثنائي'> 'لا يمكن تطبيقه على المعاملات من النوع' مزدوج؟ ' و 'Int' أي شخص يعرف الخطأ الذي أفعله.

سويفت 4
الكود: if (Double(MyValue) > 10) { // value is bigger than 10 } else { // do something else }
أنا أستخدم سلسلة متغيرة لأنني أحتاجها لتكون سلسلة حتى أتمكن من تنسيقها لاحقًا ، لقد عرفتها على أنها
الكود: var MyValue = ''

abcdefg12345

ملصق أصلي
10 يوليو 2013


  • 21 أكتوبر 2017
أصلحه بإضافة متغير آخر
الكود: let CheckValue = Double(MyValue)! if CheckValue > 10 { }
تفاعلات:960 التصميم

0002378

موقوف عن العمل
28 مايو 2017
  • 23 أكتوبر 2017
أعتقد أن Swift ، كلغة ، مضحكة للغاية في بعض الأحيان ، خاصة. قادم من برمجة Java. وقد طرحت أحد أفضل الأمثلة على ذلك.

وعلى الرغم من أن الاختيارات لها فوائدها ، إلا أنها تجعلني أيضًا أريد تحطيم جهاز الكمبيوتر الخاص بي ضد الحواف العلوية لحاوية القمامة.

ومع ذلك ، حيث يكمن موقع Swift حقًا في قسم الإغلاق ... أوه نعم! جافا بها أيضًا ، الآن ، لكن ...

وبالطبع ، حقيقة أن Swift أقل صرامة في إعلان الأنواع وتلك شبه النقطتين المزعجة ... رائع!

تفاعلات:abcdefg12345

0002378

موقوف عن العمل
28 مايو 2017
  • 24 أكتوبر 2017
أوه انتظر ، الآن بعد أن نظرت إلى الوراء في التعليمات البرمجية الخاصة بك ، أرى أن قيمة Double (سلسلة) الخاصة بك يتم تقييمها إلى Double؟ ، وهي قيمة اختيارية.

لست بحاجة إلى متغير جديد. يمكنك فقط إضافة '!' إلى Double (سلسلة) الخاصة بك ، وسوف تعمل.

أعتقد أنني كنت مخطئًا بشأن كون سويفت غبيًا في هذه الحالة. لكنني واجهت العديد من حالات شكاوى المترجم (غير قادر على مقارنة نوعين عدديين مختلفين).

غرين

15 يوليو 2015
فورت وورث
  • 24 أكتوبر 2017
أعتقد أن الحل الأنظف والأكثر Swifty هو تخزين MyValue كقيمة مزدوجة أو int (وهو ما يبدو). يمكنك بعد ذلك استخدام NumberFormatter للتعامل مع التنسيق.

أو يمكنك استخدام الربط الاختياري لإلغاء تغليف القيمة. سأجرب إحدى هذه الطرق أولاً قبل استخدام قوة فك

ابي ايدك 729

موقوف عن العمل
25 نوفمبر 2005
  • 24 أكتوبر 2017
قال مفهوم maculate: أعتقد أن Swift ، كلغة ، مضحكة للغاية في بعض الأحيان ، خاصة. قادم من برمجة Java. وقد طرحت أحد أفضل الأمثلة على ذلك.
هذا جاهل تماما. تكمن المشكلة في أن OP لا يعرف الميزة الأساسية لـ Swift ، وهي قيم اختيارية. من الواضح أن المنشئ Double (String) يمكن أن يفشل إذا كانت السلسلة لا تحتوي على رقم. لهذا السبب لا ينتج عن Double (String) ولا يمكن أن ينتج نتيجة من النوع Double ، ولكن نتيجة واحدة من النوع Double؟ ، هذه قيمة اختيارية مزدوجة. ولا يمكن مقارنة المضاعفة الاختيارية بـ Int.

'الحل' الخاص بك مروع حقًا. ال ! يعني 'أنا متأكد من أن هذا التحويل سينجح. إذا لم يحدث ذلك ، فالرجاء تعطل التطبيق. دع د = ضعف ('1234x')! سوف تحطم فقط. عمدا. لأنك لم تتحقق من عدم وجود شيء ، وكان لا شيء.

الطريقة الصحيحة هي التحقق من الخطأ. على سبيل المثال

إذا تركت d = Double (MyValue) ، d> 10 {
// احتوت MyValue على رقم ، والرقم> 10.
} آخر {
// لم تحتوي MyValue على رقم ، أو كان الرقم<= 10.
}

إذا كنت تعتقد أنه من المفيد كتابة رمز آمن ويعمل بالفعل ، فإن Swift هي اللغة الصحيحة.
تفاعلات:التعمير والاجتهوم 90

0002378

موقوف عن العمل
28 مايو 2017
  • 24 أكتوبر 2017
قال gnasher729: هذا جاهل تماما. تكمن المشكلة في أن OP لا يعرف الميزة الأساسية لـ Swift ، وهي قيم اختيارية. من الواضح أن المنشئ Double (String) يمكن أن يفشل إذا كانت السلسلة لا تحتوي على رقم. لهذا السبب لا ينتج عن Double (String) ولا يمكن أن ينتج نتيجة من النوع Double ، ولكن نتيجة واحدة من النوع Double؟ ، هذه قيمة اختيارية مزدوجة. ولا يمكن مقارنة المضاعفة الاختيارية بـ Int.

هل تعرضت للتنمر في المدرسة؟ يبدو أنك تعاني من تدني احترام الذات لأنك لا تستطيع الرد دون مهاجمتي.

سيكون هذا أول وآخر اتصال لي لك. اقتراح لك - حاول التواصل بطريقة أكثر حضارة ، وستكون الحياة رائعة. يعتني.

غرين

15 يوليو 2015
فورت وورث
  • 25 أكتوبر 2017
قال gnasher729: الطريقة الصحيحة هي التحقق من الخطأ. على سبيل المثال

إذا تركت d = Double (MyValue) ، d> 10 {
// احتوت MyValue على رقم ، والرقم> 10.
} آخر {
// لم تحتوي MyValue على رقم ، أو كان الرقم<= 10.
}

هذا غامض - ماذا لو كانت القيمة<= 10 should produce different results from the value being nil? To be fair, the OP's post is ambiguous as they were forcing the unwrap, meaning a nil value would crash. However in most business cases, a nil value would be handled differently (safely) from an insufficient value.

الطريقة الأنظف هي:

الكود: // Handle your unwrapping here, and specify what to do in case of a nil guard let d = Double(MyValue) else { return } // Then implement your if statement if d > 10 { // Do what you want if d > 10 } else { // Do what you want if d <= 10 }
على الرغم من أنني أعتقد حقًا أنه يجب تخزين MyValue كمزدوج من البداية ، وتطبيق NumberFormatter لاحقًا للتعامل مع أي تنسيق مطلوب. هذا يحمل عبئًا إدراكيًا أقل بكثير لمن ينتهي بقراءة الكود.
تفاعلات:المؤسسات

ابي ايدك 729

موقوف عن العمل
25 نوفمبر 2005
  • 26 أكتوبر 2017
قال التصور البقعي: هل تم التنمر عليك في المدرسة؟ يبدو أنك تعاني من تدني احترام الذات لأنك لا تستطيع الرد دون مهاجمتي.

سيكون هذا أول وآخر اتصال لي لك. اقتراح لك - حاول التواصل بطريقة أكثر حضارة ، وستكون الحياة رائعة. يعتني.

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

سايروس

إلى
21 أغسطس 2008
  • 26 أكتوبر 2017
أقوم بحماية معظم المرات ولكن إذا كانت كل وظيفة في فئة حراسة نفس المتغير ... فقد ترغب في إعادة النظر في واجهتك الأولية.

إدراج

14 أبريل 2018
  • 14 أبريل 2018
Swift ، غير متأكد من أن القيمة الخاصة بك صحيحة تمامًا. هناك خياران للتأكد.
1) '!' يمكنك الإشارة إلى أن هذه القيمة ستكون صحيحة int عن طريق إضافة العلامة.
الكود: if (Double(MyValue)! > 10) { // } 2) يمكنك تحديد النوع عند تحديد القيمة.
الكود: let value: Int = Double(MyValue)! if (value > 10) { // } إلى

المؤسسات

28 يناير 2006
  • 27 أبريل 2018
ynstek قال: سويفت ، غير متأكد من أن القيمة الخاصة بك صحيحة. هناك خياران للتأكد.
1) '!' يمكنك الإشارة إلى أن هذه القيمة ستكون صحيحة int عن طريق إضافة العلامة.
الكود: if (Double(MyValue)! > 10) { // } 2) يمكنك تحديد النوع عند تحديد القيمة.
الكود: let value: Int = Double(MyValue)! if (value > 10) { // }

أعتقد أن مثالك رقم 2 سيفشل لأنك تحاول تعيين سلسلة مصبوبة لمضاعفة إلى متغير Int. أيضًا ، أنت تفترض أن MyValue ليس صفريًا ، مما قد يتسبب في حدوث خطأ في وقت التشغيل إذا كان لا شيء أو غير رقمي.

شرح المثال رقم 1 الخاص بك ليس صحيحًا أيضًا. لا تقوم علامة التعجب بتحويل القيمة إلى عدد صحيح. يفك قيمة المتغير الاختياري. في المثال الخاص بك ، ستنتهي بقيمة مزدوجة ، وليس Int ، وفقط إذا لم تكن MyValue صفرية أو قيمة غير رقمية.