MISE À JOUR DE SWIFT 5
Nous pouvons obtenir de jolies descriptions des noms de types en utilisant la variable d'instance via l' String
initialiseur et créer de nouveaux objets d'une certaine classe
Comme, par exemple print(String(describing: type(of: object)))
. Où object
peut être une variable d'instance comme un tableau, un dictionnaire, un Int
, un NSDate
, etc.
Étant donné qu'il NSObject
s'agit de la classe racine de la plupart des hiérarchies de classes Objective-C, vous pouvez essayer de créer une extension pour NSObject
obtenir le nom de classe de chaque sous-classe de NSObject
. Comme ça:
extension NSObject {
var theClassName: String {
return NSStringFromClass(type(of: self))
}
}
Ou vous pouvez créer une fonction statique dont le paramètre est de type Any
(le protocole auquel tous les types se conforment implicitement) et renvoie le nom de classe en tant que chaîne. Comme ça:
class Utility{
class func classNameAsString(_ obj: Any) -> String {
//prints more readable results for dictionaries, arrays, Int, etc
return String(describing: type(of: obj))
}
}
Vous pouvez maintenant faire quelque chose comme ceci:
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
}
}
De plus, une fois que nous pouvons obtenir le nom de la classe en tant que chaîne, nous pouvons instancier de nouveaux objets de cette classe :
// 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)
Peut-être que cela aide quelqu'un là-bas !.