Sie können keine Methode für einen generischen Typ schreiben, der die Vorlage restriktiver macht.
HINWEIS : Ab Swift 2.0 können Sie jetzt Methoden schreiben, die die Vorlage einschränken. Wenn Sie Ihren Code auf 2.0 aktualisiert haben, finden Sie in anderen Antworten weiter unten neue Optionen, um dies mithilfe von Erweiterungen zu implementieren.
Der Grund, warum Sie den Fehler erhalten, 'T' is not convertible to 'T'
ist, dass Sie tatsächlich ein neues T in Ihrer Methode definieren, das überhaupt nicht mit dem ursprünglichen T zusammenhängt. Wenn Sie T in Ihrer Methode verwenden möchten, können Sie dies tun, ohne es in Ihrer Methode anzugeben.
Der Grund, warum Sie den zweiten Fehler erhalten, 'AnyObject' is not convertible to 'T'
ist, dass nicht alle möglichen Werte für T alle Klassen sind. Damit eine Instanz in AnyObject konvertiert werden kann, muss es sich um eine Klasse handeln (es kann sich nicht um eine Struktur, eine Aufzählung usw. handeln).
Am besten machen Sie es zu einer Funktion, die das Array als Argument akzeptiert:
func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
}
Anstatt das ursprüngliche Array zu ändern, können Sie Ihre Methode threadsicherer und wiederverwendbarer machen, indem Sie eine Kopie zurückgeben:
func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {
}
Als Alternative, die ich nicht empfehle, kann Ihre Methode stillschweigend fehlschlagen, wenn der im Array gespeicherte Typ nicht in die Methodenvorlage konvertiert werden kann (das ist gleichwertig). (Aus Gründen der Übersichtlichkeit verwende ich U anstelle von T für die Vorlage der Methode):
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]
Bearbeiten Um den stillen Fehler zu überwinden, können Sie den Erfolg als Bool zurückgeben:
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
aus Ihrer Methodendeklaration zu entfernen . Also einfachfunc removeObject<T: Equatable>
. Diese Frage ist verwandt: stackoverflow.com/questions/24091046/…