2016-06-22 5 views
12

चूंकि स्थैतिक संग्रहीत गुण अभी तक सामान्य प्रकार के लिए समर्थित नहीं हैं (मुझे) आश्चर्य है कि एक अच्छा विकल्प क्या है।सामान्य प्रकार के स्थिर संग्रहित गुणों के लिए स्विफ्ट में एक अच्छा विकल्प क्या है?

मेरा विशिष्ट उपयोग-मामला यह है कि मैं तेजी से एक ओआरएम बनाना चाहता हूं। मेरे पास Entity प्रोटोकॉल है जिसमें प्राथमिक कुंजी के लिए एक संबद्ध प्रकार है, क्योंकि कुछ इकाइयों के पास उनके id के रूप में पूर्णांक होगा और कुछ में स्ट्रिंग आदि होगी। इसलिए Entity प्रोटोकॉल जेनेरिक बनाता है।

अब मेरे पास EntityCollection<T: Entity> प्रकार भी है, जो संस्थाओं के संग्रह का प्रबंधन करता है और जैसा कि आप देख सकते हैं कि यह सामान्य भी है। EntityCollection का लक्ष्य यह है कि यह आपको संस्थाओं के संग्रह का उपयोग करने देता है जैसे कि वे सामान्य एरे थे, इस बात के बिना कि इसके पीछे एक डेटाबेस है। EntityCollection पूछताछ और कैशिंग का ख्याल रखेगा और यथासंभव अनुकूलित किया जा रहा है।

मैं डेटाबेस से पहले से प्राप्त सभी इकाइयों को संग्रहीत करने के लिए EntityCollection पर स्थिर गुणों का उपयोग करना चाहता था। इसलिए यदि EntityCollection के दो अलग-अलग उदाहरण डेटाबेस से एक ही इकाई लाने के लिए चाहते हैं, तो डेटाबेस केवल एक बार पूछेगा।

क्या आपके पास कोई विचार है कि मैं इसे और कैसे प्राप्त कर सकता हूं?

उत्तर

0

मैं सभी के साथ आ सकता हूं स्रोत की धारणा को अलग करना (जहां से संग्रह आता है) और फिर संग्रह स्वयं। और फिर स्रोत को कैशिंग के लिए जिम्मेदार बनाते हैं। उस बिंदु पर स्रोत वास्तव में एक उदाहरण हो सकता है, इसलिए यह जो भी कैश चाहता है उसे/रख सकता है और आपकी EntityCollection स्रोत के चारों ओर संग्रह प्रकार और/या अनुक्रम टाइप प्रोटोकॉल को बनाए रखने के लिए ज़िम्मेदार है।

कुछ की तरह:

protocol Entity { 
    associatedtype IdType : Comparable 
    var id : IdType { get } 
} 

protocol Source { 
    associatedtype EntityType : Entity 

    func first() -> [EntityType]? 
    func next(_: EntityType) -> [EntityType]? 
} 

class WebEntityGenerator <EntityType:Entity, SourceType:Source where EntityType == SourceType.EntityType> : GeneratorType { ... } 

वर्ग WebEntityCollection: यदि आप एक विशिष्ट पृष्ठांकित वेब डेटा इंटरफेस है SequenceType {...}

काम करेगा। फिर आप कुछ के साथ कुछ कर सकते हैं:

class WebQuerySource<EntityType:Entity> : Source { 
    var cache : [EntityType] 

    ... 

    func query(query:String) -> WebEntityCollection { 
     ... 
    } 
} 

let source = WebQuerySource<MyEntityType>(some base url) 

for result in source.query(some query argument) { 
} 

source.query(some query argument) 
     .map { ... } 
     .filter { ... } 
0

ऐसा कुछ?

protocol Entity { 

} 

class EntityCollection { 
    static var cachedResults = [Entity]() 

    func findById(id: Int) -> Entity? { 
     // Search cache for entity with id from table 

     // Return result if exists else... 

     // Query database 

     // If entry exists in the database append it to the cache and return it else... 

     // Return nil 
    } 
} 
+3

वह मेरे लिए काम नहीं करता है के बाद से मैं जेनेरिक प्रकार के साथ काम कर रहा हूँ और उन प्रकार स्थिर संग्रहीत गुण अनुमति नहीं है। यही कारण है कि मैं इस सवाल को पोस्ट कर रहा हूं ... – Evert

+0

शायद आप कैश को वैश्विक वैरिएबल प्रकार [AnyObject] और एंटीटी कोलेक्शन विधियों के भीतर [टी] में बदल सकते हैं? – mikem

5

मैं अगर मैं अभी तक या नहीं यह पसंद यकीन नहीं है, लेकिन मैं एक स्थिर गणना संपत्ति का इस्तेमाल किया:

private extension Array where Element: String { 
    static var allIdentifiers: [String] { 
     get { 
      return ["String 1", "String 2"] 
     } 
    } 
} 

विचार?

+1

यह सबसे स्विफ्ट समाधान की तरह लगता है। मैं वास्तव में चाहता हूं कि वे हमें संग्रहित स्थिरांक का उपयोग करने दें, हालांकि। :/ –

+2

मुझे लगता है कि यह संकलित होगा लेकिन हर बार एक नई प्रतिलिपि बनायेगा और एक गैर स्थैतिक संपत्ति की तरह व्यवहार करेगा – pshah

2

एक घंटे पहले मुझे आपकी तरह की समस्या है। मैं बेसस सर्विस क्लास और इस तरह से कई अन्य सेवाओं को विरासत में रखना चाहता हूं, केवल एक स्थिर उदाहरण के साथ। और समस्या यह है कि सभी सेवाएं अपने मॉडल का उपयोग करती हैं (उदा: उपयोगकर्ता सेवा का उपयोग कर उपयोगकर्ता सेवा ..)

संक्षेप में मैंने कोड का पालन करने की कोशिश की। और यह काम करता है!

class BaseService<Model> where Model:BaseModel { 
    var models:[Model]?; 
} 

class UserService : BaseService<User> { 
    static let shared = UserService(); 

    private init() {} 
} 

उम्मीद है कि यह मदद करता है।

मुझे लगता है कि यह चाल बेस सर्विस थी, इसका उपयोग सीधे नहीं किया जाएगा, इसलिए स्थैतिक संग्रहित संपत्ति रखने की आवश्यकता नहीं है। (पुनश्च:मैं चाहता हूं कि स्विफ्ट अमूर्त वर्ग का समर्थन करता है, बेस सर्विस सेवा होनी चाहिए)

+0

क्या एक संयोग है! मैं इस समाधान के साथ समस्या को समाप्त करता हूं और फिर मैं आपका जवाब देखता हूं! : डी – nahung89

0

यह पता चला है कि, हालांकि गुणों की अनुमति नहीं है, विधियों और गणना गुण हैं।

class MyClass<T> { 
    static func myValue() -> String { return "MyValue" } 
} 

या:: तो आप कुछ इस तरह कर सकते हैं

class MyClass<T> { 
    static var myValue: String { return "MyValue" } 
} 
संबंधित मुद्दे