Şablonda daha kısıtlayıcı olan genel bir türe bir yöntem yazamazsınız.
NOT : Swift 2.0 itibariyle, artık yöntemlerini yazabilir olan şablona daha kısıtlayıcı. Kodunuzu 2.0 sürümüne yükselttiyseniz, uzantıları kullanarak bunu uygulamak için yeni seçenekler için diğer yanıtlara bakın.
Hatayı almanızın nedeni 'T' is not convertible to 'T'
, aslında yeni bir , yönteminizde orijinal T ile hiç ilgili olmayan T .
İkinci hatayı almanızın nedeni, 'AnyObject' is not convertible to 'T'
T için olası tüm değerlerin tüm sınıflar olmamasıdır. Bir örneğin AnyObject'e dönüştürülebilmesi için bir sınıf olması gerekir (bir yapı, numaralandırma vb. Olamaz).
En iyi seçeneğiniz, diziyi bağımsız değişken olarak kabul eden bir işlev yapmaktır:
func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
}
Veya orijinal diziyi değiştirmek yerine, bir kopya döndürerek yönteminizi daha güvenli ve yeniden kullanılabilir hale getirebilirsiniz:
func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {
}
Önermediğim bir alternatif olarak, dizide saklanan tür yöntemler şablonuna dönüştürülemiyorsa (bu eşittir) yönteminizin sessizce başarısız olmasını sağlayabilirsiniz. (Açıklık için, yöntemin şablon için T yerine U kullanıyorum):
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]
Düzenle Sessiz hatanın üstesinden gelmek için başarıyı bir bool olarak döndürebilirsiniz:
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
Yöntem bildiriminizden kaldırmayı deneyin . Sadecefunc removeObject<T: Equatable>
. Bu soru aşağıdakilerle ilgilidir: stackoverflow.com/questions/24091046/…