2015-08-04 18 views
17

Tôi có một phương pháp tĩnh trong SwiftNhận tên lớp Swift trong "lớp func" phương pháp

class BaseAsyncTask: WebServiceClient { 
     class func execute(content : [String:AnyObject], cancelled:CustomBool) 
     { 
      // Print class name (BaseAsyncTask) here 
     } 
} 

Và tôi muốn biết làm thế nào để có được tên lớp bên trong phương thức đó. Tôi cố gắng

self.dynamicType 

nhưng điều đó mang lại cho lỗi (Tôi cho rằng vì sự tự bên trong một hàm lớp)

Trả lời

11

Có nhiều phương pháp khác nhau để làm điều đó, nếu phương pháp của bạn được thừa hưởng từ NSObject bạn có thể tiếp xúc với objective- c và làm một cái gì đó như thế.

@objc(BaseAsyncTask) 

class BaseAsyncTask: WebServiceClient { 
     class func execute(content : [String:AnyObject], cancelled:CustomBool) 
     { 
      println("Class \(NSStringFromClass(self))") 
     } 
} 

Đối với SWIFT tinh khiết kiểm tra mẫn ở đây về MirrorType

tôi đã tìm thấy cũng tín dụng mở rộng này để ImpactZero

public extension NSObject{ 
    public class var nameOfClass: String{ 
     return NSStringFromClass(self).components(separatedBy: ".").last! 
    } 

    public var nameOfClass: String{ 
     return NSStringFromClass(type(of: self)).components(separatedBy: ".").last! 
    } 
} 

[Xcode 8]
Alex gợi ý với tôi rằng trong Phiên bản Xcode 8 mã này hiển thị cảnh báo. Để tránh điều đó chúng ta nên tiền tố phương pháp như thế:

@nonobjc class var className: String{ 
    return NSStringFromClass(self).components(separatedBy: ".").last! 
} 
+0

NSStringFromClass (self) .componentsSeparatedByString ("."). làm việc như một say mê. Đã không xảy ra với tôi để thử tự mà không có dynamicType, cảm ơn. –

+0

AWASOME! thanks :) –

+0

@Andrea, tôi cũng sẽ đề xuất thêm thuộc tính '@ nonobjc' trước' lớp công khai var nameOfClass' để tránh cảnh báo sau (Xcode 8.2): "ld: warning: Một số tệp đối tượng có danh mục Mục tiêu-C không tương thích Một số siêu dữ liệu về danh mục có thể bị mất. Tất cả các tệp chứa các mục tiêu C phải được xây dựng bằng cách sử dụng cùng một trình biên dịch. " Giống như vậy: '@nonobjc class var className: String {return NSStringFromClass (tự) .components (separatedBy:". "). } ' – Alex

8

Bạn có thể sử dụng chuỗi suy in self: Mã

let className = "\(self)" 

mẫu:

class BaseAsyncTask: WebServiceClient { 
    class func execute(content : [String:AnyObject], cancelled: CustomBool) 
    { 
     let className = "\(self)" 
     print(className) 
    } 
} 

class AnotherAsyncTask : BaseAsyncTask { 
} 

BaseAsyncTask.execute([:], cancelled: true) // prints "BaseAsyncTask" 
AnotherAsyncTask.execute([:], cancelled: true) // prints "AnotherAsyncTask" 
+0

Thật tuyệt vời! Giải pháp tuyệt vời. – Oleg

6

Một cách khác để làm điều này, khi bạn không có một thể hiện của lớp là điều này.

Swift 4

print(String(describing:BaseAsyncTask.self)) 

Swift 2

print(String(BaseAsyncTask)) 

Lấy cảm hứng từ đây.

Get class name of object as string in Swift

+1

Điều này không hoạt động trong Swift 4. Bạn cần phải sử dụng một cái gì đó như: 'String (mô tả: BaseAsyncTask.self)' – ThomasW

+0

Đã chỉnh sửa, cảm ơn! –

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