मैं अपने एपीआई को कंक्रीट क्वेरी ऑब्जेक्ट्स को एक पैरामीटर के रूप में लेने के लिए डिजाइन कर रहा हूं, क्योंकि सभी जगहों के हस्ताक्षरों को विस्फोट करने के विपरीत पैरामीटर पारित किए जा सकते हैं।क्या आप पैरामीटर पास करने के लिए structs के लिए स्विफ्ट के डिफ़ॉल्ट प्रारंभकर्ता का लाभ उठा सकते हैं?
उदाहरण के लिए, बल्कि यह लिखने की तुलना में...
func someQuery(requiredA:Bool, requiredB:Int, requiredC:String, defaultedA:Bool = false, defaultedB:Int = 1, defaultedC:String = "X", optionalA:Bool? = nil, optionalB:Int? = nil, optionalC:String? = nil){
....
}
मैं इस लिख रहा हूँ ...
func someQuery(queryParams:QueryParams){
....
}
और मैं परिभाषित करने कर रहा हूँ (आंशिक रूप से - नीचे और अधिक) क्वेरी इस तरह की वस्तु ...;
struct QueryObject{
let requiredA : Bool
let requiredB : Int
let requiredC : String
let defaultedA : Bool
let defaultedB : Int
let defaultedC : String
let optionalA : Bool?
let optionalB : Int?
let optionalC : String?
}
के रूप में मुझे यकीन है कि आप नाम से बता सकते हैं, इस उदाहरण के लिए, कुछ आवश्यक हैं हूँ, कुछ चूक है और कुछ पूरी तरह से वैकल्पिक हैं।
अब क्वेरीपैरम्स ऑब्जेक्ट को परिभाषित करने के लिए, मैं इसे बनाने के दौरान इसे बनाने की कोशिश कर रहा हूं, उपयोगकर्ता को केवल आवश्यक पैरामीटर निर्दिष्ट करना होगा, और वैकल्पिक रूप से दूसरों को निर्दिष्ट/फिट करने के लिए वैकल्पिक रूप से निर्दिष्ट कर सकते हैं।
यहाँ क्या मैं के बाद हूँ ...
// At a minimum
let queryParams = QueryParams(requiredA:true, requiredB:1, requiredC:"x")
// Minimums overriding a default
let queryParams = QueryParams(requiredA:true, requiredB:1, requiredC:"x", defaultC:"y")
// Minimums plus an optional, still picking up all defaults
let queryParams = QueryParams(requiredA:true, requiredB:1, requiredC:"x", optionalB:8)
इस लक्ष्य को हासिल करने के लिए, मैं अपने खुद के प्रारंभकर्ता कि कुछ नहीं करता है, लेकिन आंतरिक मानकों प्रदान करती है, तो जैसे ... बनाया है
struct QueryParams{
init(
requiredA : Bool,
requiredB : Int,
requiredC : String,
defaultedA : Bool = true,
defaultedB : Int = 1,
defaultedC : String = "x",
optionalA : Bool? = nil,
optionalB : Int? = nil,
optionalC : String? = nil
){
self.requiredA = requiredA
self.requiredB = requiredB
self.requiredC = requiredC
self.defaultedA = defaultedA
self.defaultedB = defaultedB
self.defaultedC = defaultedC
self.optionalA = optionalA
self.optionalB = optionalB
self.optionalC = optionalC
}
let requiredA : Bool
let requiredB : Int
let requiredC : String
let defaultedA : Bool
let defaultedB : Int
let defaultedC : String
let optionalA : Bool?
let optionalB : Int?
let optionalC : String?
}
... जो बॉयलरप्लेट कोड के बहुत सारे जैसा लगता है। मैं यह पता लगाने की कोशिश कर रहा हूं कि स्विफ्ट के एक स्ट्रक्चर के डिफ़ॉल्ट प्रारंभकर्ता के निर्माण का लाभ उठाने का कोई तरीका है, इसलिए मुझे इसे मैन्युअल रूप से लिखना नहीं है।
ध्यान दें:
- मैं structs यहाँ का चयन कर रहा हूँ क्योंकि स्विफ्ट उन्हें कक्षा जबकि एक डिफ़ॉल्ट initializers देता AFAIK कि नहीं मिलता है।
- जाहिर है, आवश्यक पैरामीटर पहले आना होगा। इसके अलावा, इससे कोई फर्क नहीं पड़ता (हालांकि यह ठीक है अगर उन्हें परिभाषा-आदेश में भी होना चाहिए। प्वाइंट मुझे परवाह नहीं है।)
- सदस्य चर
let
याvar
हो सकते हैं। मैं बस आदत के रूप मेंlet
का उपयोग करता हूं।
तो ... क्या यह कोड सरलीकृत/कम/समाप्त हो सकता है?
संपादित। इस तरह की चीजों के लिए ऐसा करने के लिए स्वतंत्र महसूस करें। यही तो मैं करता हूं। – MarqueIV