संग्रहित इंस्टेंस गुणों को अनुमति देने वाले एम्स एक डिज़ाइन विकल्प नहीं है। संग्रहीत उदाहरण गुणों के साथ enum होने के कारण यह एक संरचना (enum superpowers के साथ) बनाता है, लेकिन बस परिप्रेक्ष्य से अब enums प्रकार गुणक की तरह कार्य करेगा। मूल रूप से विचार करना
enum Set1 {
case a
case b
case c
}
enum Times {
case x
case y
var k: Set1
}
क्या यह वास्तव में है कि enum Times
हमें Set1
और Set2
6 अलग मामलों में जिसके परिणामस्वरूप से तत्वों के किसी भी संयोजन होने की अनुमति देता है मतलब है, लेकिन रुकिए, हम जानते हैं कि वास्तव में यह एक टपल प्रकार का एक उद्देश्य है (Set1, Set2)
की तरह, जहां Times
रूप
typealias Times = (Set1, Set2)
घोषित किया जा सकता है कि मैं इस पूर्व के मामले की अनुमति नहीं दे के लिए एक उचित तर्क के रूप में कार्य करता है उम्मीद है।
कहा जा रहा है, तेज enums इस प्रकार हमें घोषित करने के लिए क्या कार्यात्मक प्रोग्रामिंग में भेदभाव संघ के रूप में जाना जाता है की अनुमति देता है हमें एक मामले साथ एक मनमाना एन-टपल जोड़ अनुमति देते हैं,। यदि आप चाहें तो मामले से जुड़ी एक संग्रहीत संपत्ति को कॉल करें। प्रकार के दृष्टिकोण से अब यह प्रकार योजक के रूप में कार्य करता है।
enum Add {
case lhs(Set1)
case rhs(Set2)
}
अब हमारे पास 5 अलग-अलग मामले हैं। अब हम 2-tuples संग्रहीत करते हैं:
enum AddTimes {
case lhs(Set1, Set2)
case rhs(Set3, Set4)
}
अब हम मूल रूप से गुणा का योग (SET1 * SET2 + set3 * SET4) है। यह पैटर्न मिलान की बात आती है जब यह एक बहुत शक्तिशाली उपकरण है।
हाउवर, कुछ असली मामले मौजूद हैं जब आप वास्तव में enum के अंदर संग्रहीत संपत्ति के रूप का अनुकरण करना चाहते हैं। इस पर विचार करें:
public enum Service {
case registerNewUser(username: String, password: String, language: String)
case login(username: String, password: String, deviceTokenº: String?)
case logout(sessionToken: String)
case sendForgotPassword(email: String)
}
(तरह ढांचे में मोया) बाकी अंतिमबिंदुओं परिभाषित करने के लिए आप एक अनुरोध आप
MoyaProvider<Service>.request(.sendForgotPassword(email: "[email protected]"))
की तरह कुछ करना होगा सक्रिय करना चाहते हैं जब एक कथात्मक तरीका है लेकिन अब आप कल्पना आप उत्पादन और परीक्षण सर्वर के बीच अंतर करना चाहते हैं। आप प्रत्येक मामले में एक और टपल तत्व के रूप में एक सर्वर जोड़ते हैं:
case forgotPassword(sessionToken: String, serverBaseURLString: String)
इस के बाद से आप मूल रूप से प्रत्येक टपल अनुरोध पैरामीटर स्टोर करने के लिए करना चाहते हैं, एक गलत अर्थ विज्ञान है हो जाएगा, लेकिन अब यह एक सर्वर आधार पते संग्रहीत करता है।
इस तरह की चीजों से बचने के लिए हम वास्तव में निम्नलिखित तरीके से हमारे प्रकार को पैरामीटर कर सकते हैं। इसके बजाय सर्वर के रूप में परिभाषित किया जा रहा है कहते हैं:
enum Server: String {
case production = "https://service.info"
case test = "http://test.service.info"
}
हम की तरह प्रत्येक मामले के लिए अलग प्रकार के साथ परिभाषित कर सकते हैं:
public struct ProductionServer: ServerType {
public static var baseURLString: String { return "https://service.info" }
}
public struct TestServer: ServerType {
public static var baseURLString: String { return "http://test.service.info" }
}
public protocol ServerType {
static var baseURLString: String { get }
}
और अंत के रूप में हमारे ServiceType parametrize
public enum Service<T> where T: ServerType {
case registerNewUser(username: String, password: String, language: String)
case login(username: String, password: String, deviceTokenº: String?)
case logout(sessionToken: String)
case sendForgotPassword(email: String)
var serverURL: URL {
return T.baseURL
}
}
public typealias ProdutionService = Service<ProductionServer>
public typealias TestService = Service<TestServer>
लेकिन Enums था संग्रहीत गुण प्रारंभ में - http: // stackoverflow।कॉम/प्रश्न/24029581/क्यों-नहीं-संग्रहीत-प्रकार-गुण-वर्ग-में-स्विफ्ट –
अच्छी तरह से enum डिफ़ॉल्ट रूप से संरचना है ताकि आप इसे बढ़ा सकें और कुछ फ़ंक्शन कर सकें जो ऐसा कर सकता है लेकिन मुझे नहीं दिखाई देता इसके लिए एक कारण ... वे स्थिर, ज्ञात, गणना की गई संरचना के लिए उपयोग किए जाते हैं और उनका उपयोग करने का सबसे अच्छा तरीका इस तरह है ... –