Swift-style-guide: تناقض في تهيئة المصفوفات والقواميس الفارغة

تم إنشاؤها على ٧ أبريل ٢٠١٧  ·  4تعليقات  ·  مصدر: raywenderlich/swift-style-guide

أود أن أقول ، أنا أتفق مع معظم ما ورد في المبادئ التوجيهية ، لكن هذا يبدو غير متسق:

https://github.com/raywenderlich/swift-style-guide#type -annotation-for-blank-arrays-and-dictionaries

يشير الدليل إلى:

// preferred
var names: [String] = []
var lookup: [String: Int] = [:]

يفضل على

// not preferred
var names = [String]()
var lookup = [String: Int]()

لكن الدليل يفضل عادة الأنواع المستنتجة لصالح الكود المضغوط:

// preferred
let message = "Click the button"
let currentBounds = computeViewBounds()

"" سريع
// غير مفضل
let message: String = "انقر فوق الزر"
دع CurrentBounds: CGRect = computeViewBounds ()

If we were being consistent, shouldn't we always prefer inferred types over explicit declaration?  I would think this is more consistent
```swift
// should be preferred
var names = [String]();
var lookup = [String: Int]();

التعليق الأكثر فائدة

في رأيي ، الدليل صحيح هنا. تقول ببساطة ، عند الاقتضاء ، حدد النوع. عندما لا ، قم بإسقاطها.

حسنًا ، لكن أليس هذا حقًا اختيارًا للأسلوب؟ لا ليس بالفعل كذلك. دعنا نلقي نظرة على بعض الأمثلة:

// preferred
var colors: [UIColor]?
var colors: [UIColor] = []
var colors: [UIColor] = [.red, .green, .blue]

الآن ، دعنا نحول هذه الأمثلة الثلاثة إلى تفضيلاتك المقترحة.

var colors: [UIColor]?
var colors = [UIColor]()
var colors = [UIColor.red, UIColor.green, UIColor.blue]

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

ماذا عن الطريقة إذن؟ حسنًا ، يمكنك بالطبع اختيار تحديد النوع دائمًا من أجل الاتساق. ومع ذلك ، أتخيل أن معظم المطورين يريدون التخلص من التعليمات البرمجية الزائدة عن الحاجة.

// do we need to specify type?
var colors: [UIColor] = rainbowColors()
// no we don't
var colors = rainbowColors()

هل هذا منطقي؟

_Edit: بكل إنصاف ، يمكنك أيضًا استنتاج مصفوفة مثل هذه ، ولكن نظرًا لأننا نتحدث عن الاتساق ، فإنني أفكر في هذا غير مطروح على الطاولة. فقط اعتقدت أنني سأكون على صواب.

// preferred
var colors: [UIColor] = [.red, .green, .blue]
// not preferred
var colors = [.red, UIColor.green, .blue]

ال 4 كومينتر

في رأيي ، الدليل صحيح هنا. تقول ببساطة ، عند الاقتضاء ، حدد النوع. عندما لا ، قم بإسقاطها.

حسنًا ، لكن أليس هذا حقًا اختيارًا للأسلوب؟ لا ليس بالفعل كذلك. دعنا نلقي نظرة على بعض الأمثلة:

// preferred
var colors: [UIColor]?
var colors: [UIColor] = []
var colors: [UIColor] = [.red, .green, .blue]

الآن ، دعنا نحول هذه الأمثلة الثلاثة إلى تفضيلاتك المقترحة.

var colors: [UIColor]?
var colors = [UIColor]()
var colors = [UIColor.red, UIColor.green, UIColor.blue]

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

ماذا عن الطريقة إذن؟ حسنًا ، يمكنك بالطبع اختيار تحديد النوع دائمًا من أجل الاتساق. ومع ذلك ، أتخيل أن معظم المطورين يريدون التخلص من التعليمات البرمجية الزائدة عن الحاجة.

// do we need to specify type?
var colors: [UIColor] = rainbowColors()
// no we don't
var colors = rainbowColors()

هل هذا منطقي؟

_Edit: بكل إنصاف ، يمكنك أيضًا استنتاج مصفوفة مثل هذه ، ولكن نظرًا لأننا نتحدث عن الاتساق ، فإنني أفكر في هذا غير مطروح على الطاولة. فقط اعتقدت أنني سأكون على صواب.

// preferred
var colors: [UIColor] = [.red, .green, .blue]
// not preferred
var colors = [.red, UIColor.green, .blue]

كنت سأذهب مع

var colors: [UIColor]?
var colors = [UIColor]()
var colors: [UIColor] = [.red, .green, .blue]

بدلا من ما فعلته أعلاه. هل نحن لا نفضل استخدام النوع المستنتج إلا عندما يكون التصريح الصريح مطلوبًا؟ بهذا المعنى يبدو السطر الثالث متسقًا.

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

// preferred
var colors: [UIColor]?
var colors: [UIColor] = []
var colors: [UIColor] = [.red]
// not preferred (in my opinion)
var colors: [UIColor]?
var colors = [UIColor]()
var colors: [UIColor] = [.red]

المشكلة التي تواجهها هي هذا التناقض:

// inconsistent?
var colors: [UIColor] = []
var colors = rainbowColors()
// your preference
var colors = [UIColor]()
var colors = rainbowColors()

RobertGummesson ، أنت تأخذ فقط الأنواع الأكثر استخدامًا مع بناء الجملة الحرفية للمصفوفة / القاموس. إذا كان لدينا فقط مصفوفات يمكن ملؤها بمصفوفات حرفية ، فسيكون كلا الحلين على ما يرام. حتى أنني اعتدت على استخدام ما كنت تقترحه. ولكن بعد ذلك حصلنا على مجموعات ، واضطررت إلى توحيد المعايير في اتفاقية شملتهم أيضًا. الذي تقترحه أقبح من الكتابة الصريحة.

var ints: Set = [1, 1, 2, 2]
var ints = Set([1, 1, 2, 2])
var ints = Set(arrayLiteral: 1, 1, 2, 2)

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

var ints: Set<Int> = []
var ints = Set<Int>() // instead of this, which, without the above, seems fine.

var ints = [1, 1, 2, 2]
var ints: [Int] = []
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

WingYn picture WingYn  ·  15تعليقات

Lweek picture Lweek  ·  5تعليقات

jackwu95 picture jackwu95  ·  6تعليقات

luki picture luki  ·  3تعليقات

jrturton picture jrturton  ·  3تعليقات