Anda tidak dapat menulis metode pada tipe generik yang lebih membatasi pada templat.
CATATAN : pada Swift 2.0, kini Anda dapat menulis metode yang berada lebih ketat pada template. Jika Anda telah memutakhirkan kode Anda ke 2.0, lihat jawaban lain lebih jauh ke bawah untuk opsi baru untuk mengimplementasikan ekstensi ini menggunakan.
Alasan Anda mendapatkan kesalahan 'T' is not convertible to 'T'
adalah bahwa Anda sebenarnya mendefinisikan yang baru T dalam metode Anda yang sama sekali tidak terkait dengan T. asli. Jika Anda ingin menggunakan T dalam metode Anda, Anda dapat melakukannya tanpa menentukannya pada metode Anda.
Alasan Anda mendapatkan kesalahan kedua 'AnyObject' is not convertible to 'T'
adalah bahwa semua nilai yang mungkin untuk T tidak semua kelas. Untuk instance yang akan dikonversi ke AnyObject, itu harus kelas (itu tidak bisa menjadi struct, enum, dll.).
Taruhan terbaik Anda adalah menjadikannya fungsi yang menerima array sebagai argumen:
func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
}
Atau alih-alih memodifikasi array asli, Anda dapat membuat metode Anda lebih aman dan dapat digunakan kembali dengan mengembalikan salinan:
func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {
}
Sebagai alternatif yang saya tidak rekomendasikan, Anda dapat gagal metode Anda secara diam-diam jika tipe yang disimpan dalam array tidak dapat dikonversi ke templat metode (yang setara). (Untuk kejelasan, saya menggunakan U alih-alih T untuk templat metode ini):
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]
Sunting Untuk mengatasi kegagalan diam, Anda dapat mengembalikan kesuksesan sebagai bool:
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
dari deklarasi metode Anda. Jadi adil sajafunc removeObject<T: Equatable>
. Pertanyaan ini terkait: stackoverflow.com/questions/24091046/…