swift3 - مواصفات - swift language



لا يمكن تمديد بنية عامة لنوع معين (1)

الطريقة التي يواجهها هذا الحاجز عادة عند محاولة توسيع صفيف. وهذا أمر قانوني:

extension Array where Element : Comparable {
}

ولكن هذا غير قانوني:

extension Array where Element == Int {
}

ويشكو معدو البيانات من:

شرط النوع نفسه يجعل المعلمة العامة 'عنصر' غير عام

والمشكلة هي استخدام == هنا في تركيبة مع نوع المعلمة نوع صفيف، لأن صفيف هو بنية عامة.

حل واحد مع صفيف هو رفع التسلسل الهرمي للميراث المصفوفة للوصول إلى شيء ليس هيكلا عاما:

extension Sequence where Iterator.Element == Int {
}

هذا قانوني لأن تسلسل و إيتراتور بروتوكولات عامة.

على الرغم من ذلك، هناك حل آخر هو رفع التسلسل الهرمي من النوع المستهدف، وهي إنت. إذا كان يمكننا العثور على بروتوكول الذي يتوافق إنت، ثم يمكننا استخدام عامل التشغيل : بدلا من == . حسنا، هناك واحد:

extension CountableClosedRange where Bound : Integer {
}

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

ولكن، كما قيل لك، مع الحظ كل هذا الخداع سوف يكون قريبا شيئا من الماضي.

مطلوب لعبة مع إضافة بعض السكر في Swift3. في الأساس، أردت أن تكون قادرة على القيام بشيء من هذا القبيل:

let randomAdjust = (-10...10).random

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

extension CountableClosedRange where Bound == Int {
    var random:Int {
        return Int(arc4random_uniform(UInt32(self.count) + 1)) + self.lowerBound
    }
}

ولكن الملعب يشكو:

error: same-type requirement makes generic parameter 'Bound' non-generic
extension CountableClosedRange where Bound == Int {

أنا لا أعرف حتى ما تقول لي هناك.