Bạn không thể viết một phương thức trên một loại chung hạn chế hơn trên mẫu.
LƯU Ý : như của Swift 2.0, bây giờ bạn có thể viết phương pháp mà là hạn chế hơn trên mẫu. Nếu bạn đã nâng cấp mã của mình lên 2.0, hãy xem các câu trả lời khác để biết thêm các tùy chọn mới để thực hiện điều này bằng cách sử dụng các tiện ích mở rộng.
Lý do bạn gặp lỗi 'T' is not convertible to 'T'
là vì bạn thực sự đang xác định một T mới trong phương thức của bạn hoàn toàn không liên quan đến T. ban đầu. Nếu bạn muốn sử dụng T trong phương thức của mình, bạn có thể làm như vậy mà không chỉ định nó trên phương thức của mình.
Lý do bạn nhận được lỗi thứ hai 'AnyObject' is not convertible to 'T'
là tất cả các giá trị có thể có cho T không phải là tất cả các lớp. Đối với một thể hiện được chuyển đổi thành AnyObject, nó phải là một lớp (nó không thể là một cấu trúc, enum, v.v.).
Đặt cược tốt nhất của bạn là làm cho nó trở thành một hàm chấp nhận mảng làm đối số:
func removeObject<T : Equatable>(object: T, inout fromArray array: [T]) {
}
Hoặc thay vì sửa đổi mảng ban đầu, bạn có thể làm cho phương thức của mình nhiều luồng an toàn hơn và có thể sử dụng lại bằng cách trả về một bản sao:
func arrayRemovingObject<T : Equatable>(object: T, fromArray array: [T]) -> [T] {
}
Để thay thế mà tôi không khuyến nghị, bạn có thể âm thầm thất bại nếu loại được lưu trữ trong mảng có thể được chuyển đổi sang mẫu phương thức (có thể tương đương). (Để rõ ràng, tôi đang sử dụng U thay vì T cho mẫu của phương thức):
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]
Chỉnh sửa Để vượt qua thất bại thầm lặng, bạn có thể trả lại thành công dưới dạng 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
khỏi khai báo phương pháp của bạn. Vì vậy, chỉ cầnfunc removeObject<T: Equatable>
. Câu hỏi này có liên quan: stackoverflow.com/questions/24091046/ từ