Ви не можете записати метод на загальний тип, який більш обмежує шаблон.
Примітка : по Swift 2.0, тепер ви можете написати методи , які є більш строгими за шаблоном. Якщо ви оновили свій код до 2.0, перегляньте інші відповіді далі, щоб дізнатися про нові варіанти впровадження цього за допомогою розширень.
Причина, за якою ви отримуєте помилку, 'T' is not convertible to 'T'
полягає в тому, що ви фактично визначаєте нову T у своєму методі, яка зовсім не пов’язана з оригіналом T. Якщо ви хотіли використовувати T у своєму методі, ви можете це зробити, не вказуючи це на своєму методі.
Причиною отримання другої помилки 'AnyObject' is not convertible to 'T'
є те, що всі можливі значення для T - це не всі класи. Щоб екземпляр, який потрібно перетворити на AnyObject, він повинен бути класом (це не може бути структура, перерахунок тощо).
Найкраще зробити це функцією, яка приймає масив як аргумент:
func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
}
Або замість зміни оригінального масиву ви можете зробити свій метод більш безпечним і багаторазовим, повернувши копію:
func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {
}
Як альтернативу, яку я не рекомендую, ви можете змусити ваш метод вийти з ладу, якщо тип, що зберігається в масиві, не може бути перетворений у шаблон методу (що можна вирівняти). (Для наочності я використовую U замість 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 / ...