আপনি জেনেরিক ধরণে এমন কোনও পদ্ধতি লিখতে পারবেন না যা টেম্পলেটটিতে আরও সীমাবদ্ধ।
উল্লেখ্য : সুইফট 2.0 হিসাবে, আপনি এখন পদ্ধতি লিখতে পারেন হয় টেমপ্লেট উপর আরো নিয়ন্ত্রণমূলক। আপনি যদি আপনার কোডটি ২.০ এ আপগ্রেড করে থাকেন তবে এক্সটেনশনগুলি ব্যবহার করে এটি প্রয়োগ করতে নতুন বিকল্পগুলির জন্য আরও উত্তর নীচে দেখুন।
আপনি 'T' is not convertible to 'T'
যে ত্রুটিটি পেয়েছেন তা হ'ল আপনি আসলে আপনার পদ্ধতিতে একটি নতুন টি সংজ্ঞায়িত করছেন যা মূল টির সাথে মোটেই সম্পর্কিত নয় you আপনি যদি আপনার পদ্ধতিতে টি ব্যবহার করতে চান তবে আপনি আপনার পদ্ধতিতে এটি নির্দিষ্ট না করেই এটি করতে পারেন।
আপনি দ্বিতীয় ত্রুটিটি পাওয়ার কারণটি 'AnyObject' is not convertible to 'T'
হ'ল টি এর জন্য সমস্ত সম্ভাব্য মানগুলি সমস্ত শ্রেণি নয়। কোনও উদাহরণকে যেকোনওজেক্টে রূপান্তরিত করার জন্য, এটি অবশ্যই একটি শ্রেণি হতে হবে (এটি কোনও স্ট্রাক্ট, এনাম ইত্যাদি হতে পারে না)।
আপনার সেরা বাজি হ'ল এটিকে একটি ফাংশন তৈরি করা যা অ্যারেটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে:
func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
}
অথবা আসল অ্যারেটি পরিবর্তনের পরিবর্তে, আপনি অনুলিপি ফিরিয়ে আপনার পদ্ধতিটি আরও থ্রেডকে নিরাপদ এবং পুনরায় ব্যবহারযোগ্য করতে পারেন:
func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {
}
বিকল্প হিসাবে আমি প্রস্তাব দিচ্ছি না, অ্যারেতে সঞ্চিত ধরণটি পদ্ধতি টেমপ্লেটে রূপান্তরিত না করা হলে আপনি চুপচাপ আপনার পদ্ধতিটি ব্যর্থ করতে পারেন (এটি সমানযোগ্য)। (স্পষ্টতার জন্য, আমি পদ্ধতির টেমপ্লেটের জন্য টি এর পরিবর্তে ইউ ব্যবহার করছি):
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/...