मान लें कि मेरे पास एक संरचना है जिसमें अदिश गुणों की एक सूची है:

struct SomeGeometricProps {
    var frame: CGRect
    var transform: CGAffineTransform
    var cornerRadius: CGFloat
    var count: Int
    var someDouble: Double
    // ...and a lot of other properties
}

अब, मैं Equatable में अनुरूपता जोड़ना चाहता हूं, लेकिन मैं प्रत्येक संपत्ति की तुलना को हार्ड-कोड नहीं करना चाहता, क्योंकि 1) यह बहुत सारे स्पेगेटी-कोड को जन्म देगा, 2) यदि कोई होगा एक नई संपत्ति जोड़ें अगर वे इसे == विधि में जोड़ना भूल जाएंगे तो यह कोड टूट जाएगा। तो, मैं निम्नलिखित कोशिश करता हूं:

extension SomeGeometricProps: Equatable {
    static func == (lhs: SomeGeometricProps, rhs: SomeGeometricProps) -> Bool {
        let lhsProperties = Mirror(reflecting: lhs).children
            .compactMap { $0.label != nil ? $0 : nil }
            .sorted { $0.label! < $1.label! }
            .compactMap { $0.value as? Equatable }
        let rhsProperties = Mirror(reflecting: rhs).children
            .compactMap { $0.label != nil ? $0 : nil }
            .sorted { $0.label! < $1.label! }
            .compactMap { $0.value as? Equatable }
        return zip(lhsProperties, rhsProperties).reduce(true) { $0 && $1.0 == $1.1 }
    }
}

लेकिन यह संकलित नहीं होता है, क्योंकि Protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirements यानी मैं अपने प्रकार के Equatable गुणों की एक सरणी नहीं बना सकता। मुझे पता है कि मैं Equatable के अनुरूप टाइप-इरेज़्ड स्ट्रक्चर लिख सकता हूं, लेकिन मेरे लिए यह एक ओवरहेड जैसा दिखता है, यह मानते हुए कि मुझे केवल समानता के लिए गुणों की सूची का परीक्षण करना है।

क्या इसे गतिशील रूप से करने का कोई तरीका है?

0
smocer 26 अक्टूबर 2020, 15:24

1 उत्तर

सबसे बढ़िया उत्तर

स्विफ्ट के हाल के संस्करणों में, यदि किसी संरचना के सभी गुण समान हैं, तो आप == फ़ंक्शन को लागू किए बिना संरचना को Equatable बना सकते हैं।

आपके मामले में, आपकी सभी संपत्तियां हैं Equatable, इसलिए आप केवल संरचना को Equatable के रूप में घोषित कर सकते हैं और आपका काम हो गया।

यदि आपकी अधिकांश संपत्तियां Equatable हैं, तो उन संपत्तियों में "समानता" जोड़ना आसान हो सकता है।

1
Duncan C 26 अक्टूबर 2020, 12:33