Вы не можете написать метод для универсального типа, который является более строгим для шаблона.
ПРИМЕЧАНИЕ. Начиная с 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)
list.removeObject("3")
list
Изменить Чтобы преодолеть тихую неудачу, вы можете вернуть успех как bool:
extension Array {
mutating func removeObject<U: Equatable>(object: U) -> Bool {
for (idx, objectToCompare) in self.enumerate() {
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/...