2015-05-28 10 views
6
में

एक आम माता पिता वर्ग का हिस्सा अगर वहाँ एक सामान्य प्रारंभकर्ताDo इंट और डबल स्विफ्ट

public required init(_ value : Double) { 
    super.init(value: value, unitType: unit) 
} 

public required init(_ value : Int) { 
    let v = Double(value) 
    super.init(value: v, unitType: unit) 
} 

कुछ तरह के रूप में इन दो initializers लिखने के लिए एक आसान तरीका है मैं सोच रहा हूँ:

public init<T>(_value : T) { 
    let v = Double(T) 
    super.init(value: v, unitType: unit) 
} 

(जो निश्चित रूप से संकलित नहीं करता है)

मैंने इंट और डबल दोनों के कोड को देखा है और किसी भी वास्तविक चीज़ को याद कर रहा हूं जो उन्हें एक साथ जोड़ता है।

+1

वे कई प्रोटोकॉल साझा करते हैं - वे दोनों 'निरपेक्ष मूल्यवान' हैं , 'तुलनात्मक', 'IntegerLiteralConvertible'। पूर्ण पदानुक्रम पर एक आसान नज़र डालने के लिए [स्विफ्टडॉक] (http://swiftdoc.org/type/Double/hierarchy/) देखें। लेकिन वास्तव में इस प्रश्न का उत्तर देने के लिए आपके द्वारा शुरू की जा रही कक्षा के बारे में अधिक जानकारी की आवश्यकता है - यह वास्तव में 'super.init' में' मूल्य: 'पर निर्भर करता है। –

+0

इसे प्रारंभ करने के लिए एक डबल की आवश्यकता है, हालांकि, मुझे लगा कि मैं किसी भी वर्ग (सहित) को डबल में डबल कर सकता हूं और इसे काम करना चाहिए। – Jeef

+1

'Int' और' Double' structs हैं, कक्षा – newacct

उत्तर

8

स्विफ्ट हैडर पर एक नज़र डालें:

extension String : StringInterpolationConvertible { 
    init(stringInterpolationSegment expr: String) 
    init(stringInterpolationSegment expr: Character) 
    init(stringInterpolationSegment expr: UnicodeScalar) 
    init(stringInterpolationSegment expr: Bool) 
    init(stringInterpolationSegment expr: Float32) 
    init(stringInterpolationSegment expr: Float64) 
    init(stringInterpolationSegment expr: UInt8) 
    init(stringInterpolationSegment expr: Int8) 
    init(stringInterpolationSegment expr: UInt16) 
    init(stringInterpolationSegment expr: Int16) 
    init(stringInterpolationSegment expr: UInt32) 
    init(stringInterpolationSegment expr: Int32) 
    init(stringInterpolationSegment expr: UInt64) 
    init(stringInterpolationSegment expr: Int64) 
    init(stringInterpolationSegment expr: UInt) 
    init(stringInterpolationSegment expr: Int) 
} 

इसी तरह:

func +(lhs: UInt8, rhs: UInt8) -> UInt8 
func +(lhs: Int8, rhs: Int8) -> Int8 
func +(lhs: UInt16, rhs: UInt16) -> UInt16 
func +(lhs: Int16, rhs: Int16) -> Int16 
func +(lhs: UInt32, rhs: UInt32) -> UInt32 
func +(lhs: Int32, rhs: Int32) -> Int32 
func +(lhs: UInt64, rhs: UInt64) -> UInt64 
func +(lhs: Int64, rhs: Int64) -> Int64 
func +(lhs: UInt, rhs: UInt) -> UInt 
func +(lhs: Int, rhs: Int) -> Int 
func +(lhs: Float, rhs: Float) -> Float 
func +(lhs: Double, rhs: Double) -> Double 
func +(lhs: Float80, rhs: Float80) -> Float80 

यदि यह सभी उन विभिन्न सांख्यिक प्रकार के लिए एक सामान्य समारोह लिखने के लिए संभव थे, वे निश्चित रूप से यह किया है। तो आपके सवाल का जवाब होना चाहिए नहीं।

(और किसी भी मामले में वे शायद ही, एक माता पिता वर्ग साझा कर सकते हैं के रूप में वे क्लासों नहीं है। वे structs कर रहे हैं।) निश्चित रूप से,

अब , यदि केवल Int और Double प्रश्न में हैं, आप एक सामान्य प्रोटोकॉल को अपनाने के लिए Int और Double का विस्तार कर सकते हैं और उस प्रोटोकॉल को अपेक्षित प्रकार बना सकते हैं ...

+3

नहीं यह एक भ्रामक उत्तर है। यह उपयोग के मामले पर निर्भर करता है। हालांकि इन प्रकारों को अपने स्वयं के अतिरिक्त ऑपरेटर की आवश्यकता होती है, लेकिन सभी पूर्णांक, जैसे कि उदाहरण के लिए 'func sum (seq: एस) -> एस जेनरेटर। एलिमेंट {वापसी कम करें (सीईसी, 0) {$ 0 + $ 1}} '। उस ने कहा, कुछ प्रोटोकॉल हैं जो पूर्णांक और फ्लोट दोनों के बीच पुल करते हैं। –

+0

@AirspeedVelocity असल में मैं बस तुम्हारे साथ आने और _right_ उत्तर देने का इंतजार कर रहा था। कृपया इसे दे दो! – matt

संबंधित मुद्दे