आप जेनेरिक प्रकार पर एक विधि नहीं लिख सकते हैं जो टेम्पलेट पर अधिक प्रतिबंधात्मक है।
नोट : स्विफ्ट 2.0 के रूप में, अब आप उन तरीकों को लिख सकते हैं जो टेम्पलेट पर अधिक प्रतिबंधात्मक हैं । यदि आपने अपने कोड को 2.0 में अपग्रेड किया है, तो एक्सटेंशन का उपयोग करके इसे लागू करने के नए विकल्पों के लिए अन्य उत्तर नीचे देखें।
आपको त्रुटि मिलने का कारण यह 'T' is not convertible to 'T'
है कि आप वास्तव में एक नया परिभाषित कर रहे हैं में अपनी पद्धति में T जो मूल T से संबंधित नहीं है। यदि आप अपनी विधि में T का उपयोग करना चाहते हैं, तो आप इसे अपनी विधि पर निर्दिष्ट किए बिना कर सकते हैं।
दूसरा त्रुटि प्राप्त करने का कारण यह 'AnyObject' is not convertible to 'T'
है कि टी के लिए सभी संभावित मान सभी वर्ग नहीं हैं। किसी भी उदाहरण के लिए AnyObject में परिवर्तित होने के लिए, यह एक वर्ग होना चाहिए (यह एक संरचना, enum, आदि नहीं हो सकता है)।
आपका सबसे अच्छा शर्त यह है कि इसे एक ऐसा फंक्शन बनाया जाए जो एरे को एक तर्क के रूप में स्वीकार करे:
func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
}
या मूल सरणी को संशोधित करने के बजाय, आप अपनी विधि को कॉपी वापस करके अधिक थ्रेड को सुरक्षित और पुन: प्रयोज्य बना सकते हैं:
func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {
}
एक विकल्प के रूप में जिसकी मैं अनुशंसा नहीं करता हूं, आप अपने तरीके को चुपचाप विफल कर सकते हैं यदि सरणी में संग्रहीत प्रकार को विधि टेम्पलेट में परिवर्तित नहीं किया जा सकता है (जो समान है)। (स्पष्टता के लिए, मैं विधि के खाके के लिए T के बजाय U का उपयोग कर रहा हूं):
extension Array {
mutating func removeObject<U: Equatable>(object: U) {
var index: Int?
for (idx, objectToCompare) in enumerate(self) {
if let to = objectToCompare as? U {
if object == to {
index = idx
}
}
}
if(index != nil) {
self.removeAtIndex(index!)
}
}
}
var list = [1,2,3]
list.removeObject(2) // Successfully removes 2 because types matched
list.removeObject("3") // fails silently to remove anything because the types don't match
list // [1, 3]
संपादित करें मौन विफलता को दूर करने के लिए आप एक बूल के रूप में सफलता लौटा सकते हैं:
extension Array {
mutating func removeObject<U: Equatable>(object: U) -> Bool {
for (idx, objectToCompare) in self.enumerate() { //in old swift use enumerate(self)
if let to = objectToCompare as? U {
if object == to {
self.removeAtIndex(idx)
return true
}
}
}
return false
}
}
var list = [1,2,3,2]
list.removeObject(2)
list
list.removeObject(2)
list
T where
अपनी विधि घोषणा से हटाने का प्रयास करें । तो बसfunc removeObject<T: Equatable>
। यह प्रश्न संबंधित है: stackoverflow.com/questions/24091046/…