Đó 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 true
khôngfalse
, bởi vì nó được kiểm tra NSObject
(vì loại kết quả của c.dynamicType
là NSObject.Type
không NSNumber.Type
).
Nguồn
2014-12-30 20:43:26
Bạn hoàn toàn đúng! –