2015-03-05 21 views
12

Tôi đang cố gắng để đánh dấu một biến của một kiểu generic như yếu:chế generic Class-chỉ trong Swift

class X<T> { 
    weak var t: T? 
} 

Nếu tôi không đưa vào bất kỳ trở ngại cho T tôi nhận được lỗi weak cannot be applied to non-class type 'T'.

Nếu tôi sẽ chỉ sử dụng sử dụng này với các lớp NSObject nguồn gốc này sẽ làm việc:

class X<T: NSObject> { 
    weak var t: T? 
} 

Nhưng tôi cũng muốn để có thể sử dụng các lớp Swift tinh khiết.

Đối với các giao thức có thể yêu cầu các implementor là loại lớp bằng công class keyword:

protocol ClassType: class { 
} 

Với giao thức ClassType bây giờ tôi có thể đánh dấu các biến như yếu:

class X<T: ClassType> { 
    weak var t: T? 
} 

Nhưng tôi không thể thêm từ khóa class trực tiếp vào thông số chung:

class X<T: class> { // Compile error 
    weak var t: T? 
} 

tôi có thể làm công việc giải pháp giao thức cho mọi tầng lớp NSObject xuất phát với một phần mở rộng:

extension NSObject: ClassType { 
} 

Nhưng đối với lớp Swift tinh khiết không có lớp cha phổ biến mà tôi có thể thêm phần mở rộng này để. Có cách nào để thực hiện công việc này mà không cần thêm giao thức ClassType vào mỗi lớp tôi muốn sử dụng lớp X không? Ví dụ. một số vòng loại đặc biệt cho tham số chung như class X<T:ThisIsAClass>?

Trả lời

17

Bạn muốn AnyObject, mà các tài liệu Swift mô tả như sau:

Giao thức mà tất cả các lớp học phù hợp ngầm.

class X<T: AnyObject> { 
    weak var t: T? 
} 

class C { } 
let x = X<C>() // works fine 
x.t = C() 

// error: type 'Int' does not conform to protocol ‘AnyObject’ 
// (because Int is a struct) 
let y = X<Int>() 
Các vấn đề liên quan