2015-03-12 24 views
6

Tôi đang cố gắng viết một hàm lấy đối tượng và kiểu làm đối số và trả về boolean cho biết đối tượng có thuộc loại đã cho hay không. Có vẻ như không phải là một loại Loại, vì vậy tôi không chắc chắn làm thế nào để làm điều này. Điều tốt nhất tôi đã có thể làm làChức năng Generic Swift để kiểm tra đối tượng loại

func objectIsType<T>(object: AnyObject, someObjectOfType: T) -> Bool { 
    return object is T 
} 

Vì vậy, tôi có thể làm objectIsType(x, 5), để kiểm tra nếu x là một Int hoặc objectIsType(x, "hi") để xem nếu nó là một chuỗi, nhưng tôi muốn để có thể gọi objectIsType(x, Int) để xem liệu x có phải là IntobjectIsType(x, String) để xem đó có phải là String hay không. Có phải bất cư thứ gì như thế này đều được?

Edit:

tốc độ bay Velocity cải thiện chức năng của tôi và làm cho một điểm tuyệt vời về nó làm chính xác những gì is đã làm. Chức năng mới là:

func objectIsType<T>(object: Any, someObjectOfType: T.Type) -> Bool { 
    return object is T 
} 

Điều tôi đang cố gắng xác thực rằng các giá trị của từ điển [String: Any] là loại mà tôi mong đợi. Ví dụ:

let validator: [String: Any.Type] = [ 
    "gimme an int": Int.self, 
    "this better be a string": String.self 
] 

let validatee: [String: Any] = [ 
    "gimme an int": 3, 
    "this better be a string": "it is!" 
] 

for (key, type) in validator { 
    if !objectIsType(validatee[key], type) { 
     selfDestruct() 
    } 
} 

Nhưng tôi gặp lỗi, <>protocol.Type is not convertible to T.type. Tôi đã nhìn vào tài liệu Metatype, nhưng tôi vẫn còn một chút bối rối.

+2

Sử dụng 'AnyObject' nguy hiểm ở đây. 'x' sẽ được chuyển đổi từ' Int' thành 'NSNumber' thành' objectIsType (5 thành Int, 5 thành Double) == true' –

+1

Có thể, bạn nên đăng bài chỉnh sửa của mình dưới dạng một câu hỏi khác. – rintaro

Trả lời

2

Nếu bạn muốn cung cấp một loại như là đối số, không phải là một giá trị, bạn có thể làm như sau:

func objectIsType<T>(object: Any, someObjectOfType: T.Type) -> Bool { 
    return object is T 
} 

let a: Any = 1 

objectIsType(a, Int.self) // returns true 

NB, AnyObject chỉ có thể tham khảo các lớp học, chứ không phải cấu trúc hoặc enums. IntString là các cấu trúc. Nếu bạn thay đổi mã của mình, như tôi đã nói ở trên, để có một Any, nó cũng hoạt động với các cấu trúc. Nó có thể có vẻ như ban đầu của bạn làm việc mà không có sự thay đổi này, nhưng thực sự những gì đã xảy ra là interop đã chuyển đổi của bạn Int thành một NSNumber, đó là một chút của một cách vòng xoay làm việc và sẽ không thích ứng với metatype dựa trên cách tiếp cận.

Nhưng câu hỏi thực sự là, tại sao bạn nghĩ bạn cần điều này? is đã thực hiện chính xác điều này.

+0

Cảm ơn @Airspeed! Rất thích nghe bất kỳ suy nghĩ nào về chỉnh sửa của tôi. – mway

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