SWIFT 5로 업데이트
이니셜 라이저를 통해 인스턴스 변수 를 사용하여 유형 이름에 대한 설명을 얻을 수 있으며 특정 클래스의 새 객체를 만들 수 있습니다String
예를 들어 print(String(describing: type(of: object)))
. 여기서 object
될 수 인스턴스 변수 어레이, 딕셔너리, 추천 Int
하는 NSDate
등
NSObject
대부분의 Objective-C 클래스 계층 구조의 루트 클래스 이므로 NSObject
의 모든 하위 클래스의 클래스 이름을 가져 오기 위해 확장을 시도 할 수 NSObject
있습니다. 이처럼 :
extension NSObject {
var theClassName: String {
return NSStringFromClass(type(of: self))
}
}
또는 매개 변수 유형 Any
(모든 유형이 내재적으로 준수하는 프로토콜) 인 정적 기능을 작성 하고 클래스 이름을 문자열로 리턴 할 수 있습니다. 이처럼 :
class Utility{
class func classNameAsString(_ obj: Any) -> String {
//prints more readable results for dictionaries, arrays, Int, etc
return String(describing: type(of: obj))
}
}
이제 다음과 같이 할 수 있습니다 :
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
}
}
또한 클래스 이름을 String으로 가져 오면 해당 클래스의 새 객체를 인스턴스화 할 수 있습니다 .
// 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)
어쩌면 이것은 누군가를 도울 수 있습니다!.