2014-09-19 14 views
5

लागू करने वाले मूल्य के साथ टाइपियास शब्दकोश मैं स्ट्रिंग कुंजी का एक शब्दकोश टाइप करना चाहता हूं और ऑब्जेक्ट/स्ट्रक्चर के मानों को टाइप करना चाहता हूं जो समतुल्य प्रोटोकॉल लागू करता है। तो मैंने कोड की इस पंक्ति को लिखा लेकिन मुझे यह त्रुटि मिली कि मुझे नहीं पता था कि कैसे ठीक किया जाए। जैसे एक प्रोटोकॉल में एक चर, के रूप में: [Equatable स्ट्रिंग]:स्विफ्ट - एक सामान्य प्रोटोकॉल

typealias Storage = [String: Equatable] 

मैं प्रकार का उपयोग करना

protocol StorageModel { 
    var storage: Storage { get set } 
    init(storage: Storage) 
} 

त्रुटि:

Protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirements

enter image description here किसी को भी एक समाधान सुझाव दे सकते हैं ?

उत्तर

5

सामान्य शब्दों में, प्रोटोकॉल टैग की आवश्यकता नहीं है, प्रोटोकॉल के नाम प्रथम श्रेणी के प्रकार नाम हैं और सीधे इस्तेमाल किया जा सकता है:

typealias Storage = [String:Equatable] 

इस मामले में, क्या त्रुटि कह रहा है कि क्योंकि Equatable func == (lhs:Self, rhs:Self) -> Bool और विशेष रूप से lhs:Self, Equatable एक सामान्य पर एक बाधा के रूप में छोड़कर नहीं किया जा सकता शामिल हैं:

class Generic<T:Equatable> { ... } 

आप क्या हासिल करने की कोशिश कर रहे हैं और कैसे आप StorageModel उपयोग करने के लिए कोशिश कर रहे हैं के बारे में अधिक जानकारी के बिना, सबसे अच्छा मैं साथ आ सकता हूँ है:

class StorageModel <T:Equatable> { 
    var storage: [String:T] 

    init(storage:[String:T]) { 
     self.storage = storage 
    } 
} 
वहां से

आप कुछ शोध करने की आवश्यकता होगी, स्विफ्ट के मैनुअल में खुदाई, कुछ Googling करने और देखने:

protocol Matches { 
    typealias T 
    func matches(t:T) -> Bool 
} 

protocol StorageModel { 
    typealias T 
    var storage: [String:T] { get set } 
    init(storage:[String:T]) 
} 

extension Int : Matches { 
    func matches(target:Int) -> Bool { 
     return self == target 
    } 
} 

class MyClass <T:Matches> { 
    var model = [String:T]() 


} 

एक और संभावना है एक प्रोटोकॉल के बजाय एक सामान्य उपयोग करने के लिए है क्या आपकी समस्या हल करता है।

+0

मुझे इसे दूसरे शब्दों में कैसे प्राप्त करना चाहिए? –

+1

कैसे समेकित परिभाषित किया गया है, मुझे नहीं लगता कि आप अपने स्वयं के प्रोटोकॉल को परिभाषित किए बिना कर सकते हैं जो बहुत ही समान दिखता है, और फिर भी मुझे लगता है कि आप एक ही समस्या में भाग लेंगे। आपका सबसे अच्छा शर्त एक नए प्रोटोकॉल को परिभाषित करना हो सकता है जो बराबर विधि को परिभाषित करता है और इसका उपयोग करता है। –

+0

मैंने अभी सवाल को अद्यतन किया है, क्या आप मेरी मदद कर सकते हैं कि मैं कैसे काम कर सकता हूं? –

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