CẬP NHẬT ĐẾN 5
Chúng ta có thể nhận được các mô tả đẹp về tên loại bằng cách sử dụng biến thể hiện thông qua trình String
khởi tạo và tạo các đối tượng mới của một lớp nhất định
Giống như, ví dụ print(String(describing: type(of: object)))
. Trường hợp object
có thể là một biến đối tượng như mảng, từ điển, an Int
, a NSDate
, v.v.
Bởi vì NSObject
là lớp gốc của hầu hết các cấu trúc phân cấp của lớp Objective-C, bạn có thể thử tạo một phần mở rộng NSObject
để lấy tên lớp của mỗi lớp con của NSObject
. Như thế này:
extension NSObject {
var theClassName: String {
return NSStringFromClass(type(of: self))
}
}
Hoặc bạn có thể tạo một chức năng tĩnh có tham số là loại Any
(Giao thức mà tất cả các loại tuân thủ ngầm) và trả về tên lớp là Chuỗi. Như thế này:
class Utility{
class func classNameAsString(_ obj: Any) -> String {
//prints more readable results for dictionaries, arrays, Int, etc
return String(describing: type(of: obj))
}
}
Bây giờ bạn có thể làm một cái gì đó như thế này:
class ClassOne : UIViewController{ /* some code here */ }
class ClassTwo : ClassOne{ /* some code here */ }
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Get the class name as String
let dictionary: [String: CGFloat] = [:]
let array: [Int] = []
let int = 9
let numFloat: CGFloat = 3.0
let numDouble: Double = 1.0
let classOne = ClassOne()
let classTwo: ClassTwo? = ClassTwo()
let now = NSDate()
let lbl = UILabel()
print("dictionary: [String: CGFloat] = [:] -> \(Utility.classNameAsString(dictionary))")
print("array: [Int] = [] -> \(Utility.classNameAsString(array))")
print("int = 9 -> \(Utility.classNameAsString(int))")
print("numFloat: CGFloat = 3.0 -> \(Utility.classNameAsString(numFloat))")
print("numDouble: Double = 1.0 -> \(Utility.classNameAsString(numDouble))")
print("classOne = ClassOne() -> \((ClassOne).self)") //we use the Extension
if classTwo != nil {
print("classTwo: ClassTwo? = ClassTwo() -> \(Utility.classNameAsString(classTwo!))") //now we can use a Forced-Value Expression and unwrap the value
}
print("now = Date() -> \(Utility.classNameAsString(now))")
print("lbl = UILabel() -> \(String(describing: type(of: lbl)))") // we use the String initializer directly
}
}
Ngoài ra, một khi chúng ta có thể lấy tên lớp là String, chúng ta có thể khởi tạo các đối tượng mới của lớp đó :
// Instantiate a class from a String
print("\nInstantiate a class from a String")
let aClassName = classOne.theClassName
let aClassType = NSClassFromString(aClassName) as! NSObject.Type
let instance = aClassType.init() // we create a new object
print(String(cString: class_getName(type(of: instance))))
print(instance.self is ClassOne)
Có lẽ điều này giúp ai đó ngoài kia!.