2014-12-30 14 views
5

Hãy xem xét ví dụ này đơn giảnđèo loại chức năng chung và so sánh

func contains<T>(type t: T.Type) -> Bool { 
    for i in 0..<list.count { 
     if list[i] is t { // compiler says: 't' is not a type 
      return true 
     } 
    } 
    return false 
} 

Trình biên dịch phản ứng với

't' is not a type 

Vì tôi không thể tuyên bố một loại tĩnh và làm một tấm séc với is MyStaticType, làm thế nào tôi có thể hoàn thành điều này trong Swift với Generics?

Trả lời

3

Bạn nên kiểm tra nếu nó T:

if list[i] is T { 
    ... 
} 
+0

Bạn hoàn toàn đúng! –

2

Đó là bởi vì t thực sự không phải là một kiểu. Đó là một thể hiện của loại Metatype:

let x = NSString.self 
// compiler error because the following is 
// always true but you get the idea... 
x is NSString.Type 

Bạn chỉ muốn kiểm tra chống T, đó là loại thực tế, nhưng có thể sử dụng T.Type lái xe việc xác định những gì T là:

// genericised a bit, to make list an argument 
func contains 
    <S: SequenceType, T> 
    (list: S, type t: T.Type) -> Bool { 
    for element in list { 
     if element is T { 
      return true 
     } 
    } 
    return false 
} 

let a = ["a","b","c"] 
contains(a, type: String.self) // true 
contains(a, type: NSString.self) // true 
contains(a, type: Int.self)  // false 
contains(a, type: NSNumber.self) // false 

let b: [Any] = [1, 2 as NSNumber, "c" as NSString] 
contains(b, type: String.self) // true 
contains(b, type: NSString.self) // true 
contains(b, type: Int.self)  // true 
contains(b, type: NSNumber.self) // true 

Gấu trong tâm trí mặc dù rằng T vẫn đang được xác định tĩnh tại thời gian biên dịch, chứ không phải động. Vì vậy:

let c: NSObject = 1 as NSNumber 
contains(a, type: c.dynamicType) 

lợi nhuận truekhôngfalse, bởi vì nó được kiểm tra NSObject (vì loại kết quả của c.dynamicTypeNSObject.Type không NSNumber.Type).

Các vấn đề liên quan