คุณไม่สามารถเขียนวิธีการในประเภททั่วไปที่มีข้อ จำกัด มากขึ้นในแม่แบบ
หมายเหตุ : ตั้งแต่ Swift 2.0 คุณสามารถเขียนวิธีการต่างๆได้ข้อ จำกัด เพิ่มเติมเกี่ยวกับแม่แบบ หากคุณได้อัปเกรดรหัสของคุณเป็น 2.0 ดูคำตอบอื่น ๆ เพิ่มเติมสำหรับตัวเลือกใหม่ในการใช้งานโดยใช้ส่วนขยาย
เหตุผลที่คุณได้รับข้อผิดพลาด'T' is not convertible to 'T'
คือคุณกำลังกำหนดใหม่ Tในวิธีการที่ไม่เกี่ยวข้องกับ T ต้นฉบับทั้งหมดหากคุณต้องการใช้ T ในวิธีการของคุณคุณสามารถทำได้โดยไม่ต้องระบุวิธีการของคุณ
เหตุผลที่คุณได้รับข้อผิดพลาดที่สอง'AnyObject' is not convertible to 'T'
คือค่าที่เป็นไปได้ทั้งหมดสำหรับ T ไม่ใช่คลาสทั้งหมด สำหรับอินสแตนซ์ที่จะถูกแปลงเป็น AnyObject ต้องเป็นคลาส (ไม่สามารถเป็น struct, enum, ฯลฯ )
ทางออกที่ดีที่สุดของคุณคือทำให้ฟังก์ชั่นที่ยอมรับอาร์เรย์เป็นอาร์กิวเมนต์:
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/…