2014-08-27 16 views
14

Tôi đã chuyển một tham số cho một hàm kiểu AnyObject vì bất kỳ thứ gì có thể được truyền cho nó. Có cách nào để có được kiểu Object được truyền, động không?Nhận loại AnyObject động trong Swift

+0

Tôi xin nói, rằng không có một câu trả lời trong chủ đề này đã không giúp tôi. Vấn đề của tôi là tôi không thể lấy thông tin loại trong khi gỡ lỗi, để biết cách xử lý đối tượng Bất kỳ, để xem nội dung thực tế, bởi vì tôi không biết loại đối tượng Bất kỳ tôi không biết loại nào tôi cần để truyền nó để xem nội dung. Và giải pháp tốt nhất cho tôi là đưa đối tượng Bất kỳ vào NSObject và xem thuộc tính className của nó chẳng hạn: ((json ["glossary"] dưới dạng NSDictionary) ["title"] là NSObject) .className nó hiển thị cho tôi "__NSDictionaryM ", và ví dụ: – Pavel

Trả lời

12

Thông thường đây là những gì generics cho. Có ít khi có lý do chính đáng để có mã số AnyObject không tương tác với ObjC. Nếu sau đó bạn thực hiện các hành động khác nhau dựa trên loại, thì có thể bạn thực sự muốn sử dụng quá tải.

Điều đó nói rằng, có một số cách để truy cập vào loại. Thông thường bạn muốn chạy đoạn mã khác nhau tùy thuộc vào loại, vì vậy bạn có thể sử dụng một switch cho rằng:

let x:AnyObject = "asdf" 
switch x { 
case is String: println("I'm a string") 
default: println("I'm not a string") 
} 

hoặc

let x:AnyObject = "asdf" 
switch x { 
case let xString as String: println("I'm a string: \(xString)") 
default: println("I'm not a string") 
} 

Hoặc bạn có thể sử dụng một nếu:

if let string = x as? String { 
    println("I'm a string: \(string)") 
} 

Xem "Nhập Casting cho Bất kỳ và AnyObject" trong Ngôn ngữ lập trình Swift để thảo luận thêm.

Nhưng một lần nữa, trừ khi bạn đang làm việc với mã ObjC, ít khi có lý do để sử dụng Any hoặc AnyObject. Generics và overloads là những công cụ được thiết kế để giải quyết những vấn đề đó trong Swift.

0

đầu tiên nhập khẩu Foundation

và nếu bạn wan't loại test1 làm điều đó:

var test1 = "test" 

println(_stdlib_getTypeName(test1)) 

Bạn sẽ nhận được "TTSS" TTSS nghĩa String.

nếu bạn cố gắng với một Int nó sẽ là TtSi (i cho int)

+1

Hãy nhớ rằng các tên loại này là riêng tư và có thể thay đổi bất cứ lúc nào. Dấu gạch dưới hàng đầu trong tên hàm là một chỉ báo từ Apple rằng đây là một hàm nội bộ không có ý định được gọi từ bên ngoài stdlib. –

+0

Sử dụng số nhận dạng chưa được giải quyết '_stdlib_getTypeName' – Sander

28

Không rõ ý bạn là "loại" trong câu hỏi của bạn. Đối với mọi giá trị của bất kỳ loại nào trong Swift, bạn có thể có loại thời gian chạy động như sau:

theVariable.dynamicType 

Những gì bạn có thể làm với nó là một câu hỏi khác.

Swift 3 phiên bản với gợi ý @jojodmo 's:

type(of: theVariable) 
+0

Điều này sẽ là anwser cho câu hỏi này. –

+8

Trong Swift 3, nó đã được thay đổi thành 'type (of: theVariable)' – Jojodmo

0
func testType(value:AnyObject!){ 

    if let v = value as? NSString{ 

     println("NSString") 

    }else if let v = value as? NSNumber{ 

     println("NSNumber") 

    }else if let v = value as? Double{ 

     println("Double") 

    }else if let v = value as? Int{ 
     println("Int") 
    } 
} 
+0

Vui lòng thêm một số giải thích. –

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