swift - সুইফটে যেখানে ক্লজ ব্যবহার করে অ্যারের প্রকারগুলি প্রসারিত করুন




generics swift2 (4)

আপনি যদি কেবল একটি নির্দিষ্ট Array প্রসারিত করতে চান তবে আপনাকে প্রতিটি প্রকারের জন্য একটি প্রোটোকল ব্যবহার করতে হবে:

protocol DoubleValue {
    var value: Double { get }
}
extension Double: DoubleValue {
    var value: Double { return self }
}
extension Array where Element: DoubleValue {
    // use the value property
}

// the same for Float
protocol FloatValue {
    var value: Float { get }
}

extension Float: FloatValue {
    var value: Float { return self }
}
extension Array where Element: FloatValue {
    // use the value property
}

আমি [ফ্লোট] এবং [ডাবল] প্রসারিত করতে ত্বরণী কাঠামোটি ব্যবহার করতে চাই তবে এগুলির প্রতিটিটিরই আলাদা বাস্তবায়ন প্রয়োজন।

আমি স্পষ্ট চেষ্টা করেছি:

extension Array<Float> {
}

এবং এই ত্রুটিটি পান:

"সীমাবদ্ধ এক্সটেনশানটি 'যেখানে' ধারা 'দ্বারা নির্দিষ্ট বাধাগুলির সাথে অনির্দিষ্ট বিশেষ জেনেরিক ধরণের' অ্যারে 'তে ঘোষণা করতে হবে

সুইফট 2 এ এভাবে জেনেরিক প্রকারগুলি প্রসারিত করা কি কার্যকর?

কোডটি এখন আশানুরূপভাবে কাজ করেছি। এক্সিলারেট ফ্রেমওয়ার্কটি ব্যবহার করে একটি সংশ্লেষ দেখানোর একটি উদাহরণ এখানে।

extension _ArrayType where Generator.Element == Float {

    func quickSum() -> Float {
        var result: Float = 0
        if var x = self as? [Float] {
            vDSP_sve(&x, 1, &result, vDSP_Length(x.count))
        }
        return result
    }
}

extension _ArrayType where Generator.Element == Double {

    func quickSum() -> Double {
        var result: Double = 0
        if var x = self as? [Double] {
            vDSP_sveD(&x, 1, &result, vDSP_Length(x.count))
        }
        return result
    }
}

আপনি যদি নির্দিষ্ট ধরণের সাথে কেবল অ্যারে প্রসারিত করতে চান। আপনার _আরে টাইপ প্রোটোকল প্রসারিত করা উচিত।

extension _ArrayType where Generator.Element == Int {

   func doSomething() {
       ... 
   }
}

আপনি যদি Array প্রসারিত করেন তবে আপনি কেবল নিশ্চিত করতে পারেন যে আপনার উপাদানটি অন্য কোনও প্রোটোকল অনুসারে তৈরি হয়েছে। অর্থাৎ,

extension Array where Element: Equatable {

   func doSomething() {
       ... 
   }
}

আপডেট হয়েছে: সুইফট ৩.১ সহ https://github.com/apple/swift/blob/master/CHANGELOG.md

extension Array where Element == Int {

   func doSomething() {
       ... 
   }
}

কেমন

extension CollectionType where Generator.Element == Double {

}

অথবা আপনি যদি আরও কিছু চান:

protocol ArithmeticType {
    func +(lhs: Self, rhs: Self) -> Self
    func -(lhs: Self, rhs: Self) -> Self
    func *(lhs: Self, rhs: Self) -> Self
    func /(lhs: Self, rhs: Self) -> Self
}

extension Double : ArithmeticType {}
extension Float : ArithmeticType {}

extension SequenceType where Generator.Element : protocol<FloatLiteralConvertible, ArithmeticType> {
    var sum : Generator.Element {
        return reduce(0.0, combine: +)
    }

    var product : Generator.Element {
        return reduce(1.0, combine: *)
    }
}


stride(from: 1.0, through: 10.0, by: 1.0).sum   // 55
[1.5, 2.0, 3.5, 4.0, 5.5].product               // 231

Double এবং Float বা অন্য যে কোনও প্রকারের সাথে আপনি প্রোটোকল FloatLiteralConvertible টাইপ এবং FloatLiteralConvertible সাথে FloatLiteralConvertible যদি আপনার অ্যারের নির্দিষ্ট সূচকগুলি অ্যাক্সেস করার প্রয়োজন হয় তবে SequenceType CollectionType SequenceType পরিবর্তন করুন কারণ আপনি এটি ক্রম দিয়ে না করতে পারেন।


সুইফট 3 উদ্ধার!

extension Collection where Iterator.Element == Int {
    // `Collection` can be `Sequence`, etc
}




swift-extensions