स्विफ्ट में स्ट्रिंग के रूप में ऑब्जेक्ट का वर्ग नाम प्राप्त करें


320

Stringउपयोग के रूप में किसी वस्तु का वर्गनाम प्राप्त करना :

object_getClassName(myViewController)

कुछ इस तरह देता है:

_TtC5AppName22CalendarViewController

मैं शुद्ध संस्करण की तलाश में हूँ "CalendarViewController":। मैं इसके बजाय कक्षा के नाम की एक साफ़ की हुई स्ट्रिंग कैसे प्राप्त करूं ?

मुझे इस बारे में प्रश्नों के कुछ प्रयास मिले लेकिन वास्तविक उत्तर नहीं। क्या यह बिल्कुल भी संभव नहीं है?


वैकल्पिक रूप से ... इस तरह दिखने के लिए एक प्रभावी पार्सर फ़ंक्शन क्या होगा?
बेरंड

यदि आप जांचना चाहते हैं कि कोई वस्तु किसी निश्चित वर्ग की है तो इसका उत्तर देखें ।
अर्थ-मायने

जवाबों:


529

एक उदाहरण से स्ट्रिंग :

String(describing: YourType.self)

एक प्रकार से स्ट्रिंग :

String(describing: self)

उदाहरण:

struct Foo {

    // Instance Level
    var typeName: String {
        return String(describing: Foo.self)
    }

    // Instance Level - Alternative Way
    var otherTypeName: String {
        let thisType = type(of: self)
        return String(describing: thisType)
    }

    // Type Level
    static var typeName: String {
        return String(describing: self)
    }

}

Foo().typeName       // = "Foo"
Foo().otherTypeName  // = "Foo"
Foo.typeName         // = "Foo"

के साथ परीक्षण किया class, structऔर enum


4
क्या वास्तव में यह मामला है? स्ट्रिंग के लिए इस इनिशियलाइज़र के लिए डॉक्स के अनुसार "स्विफ्ट मानक लाइब्रेरी द्वारा स्वचालित रूप से एक अनिर्दिष्ट परिणाम की आपूर्ति की जाती है" जब यह स्ट्रीम करने योग्य, या कस्टमस्ट्रिंगकॉनवर्टिबल, या कस्टमडेबगस्ट्रिंगकॉनवर्टिबल के अनुरूप नहीं होता है। इसलिए जब यह अभी वांछित मूल्य प्रदर्शित कर रहा है, तो क्या यह भविष्य में भी जारी रहेगा?
टॉड कनिंघम

3
Xcode 7.3.1 और स्विफ्ट 2.2 में इसका उपयोग करने से निम्नलिखित उत्पादन होता है, जो कि कोई आदर्श नहीं है। '' नाम दें = स्ट्रिंग (स्व) नाम स्ट्रिंग "<MyAppName.MyClassName: 0x #########" "'
कोडबेंडर

13
स्विफ्ट 3 में, उचित String(describing: MyViewController.self)उत्तर नीचे दिए गए कुछ उत्तरों के रूप में कॉल करने के लिए है ।
अमिताभ

10
लेकिन यह "MyViewController.TYPE" देता है!
orkenstein

3
@ रुडोल्फअदमकोविक हां, यह सच होगा। लेकिन मुझे कक्षा का नाम स्पष्ट रूप से लिखना पसंद नहीं है (क्या होगा अगर मैं कक्षा Fooका नाम बदल दूं Foo2लेकिन Fooकहीं और एक वर्ग बनाऊं , जो कोड को तोड़ सकता है)। सबक्लासिंग के मामले में आपको type(of:)या तो उपयोग करने की आवश्यकता होती है या Type.selfजो आपकी आवश्यकता पर निर्भर करता है। संभवतः type(of:)वर्ग नाम प्राप्त करने के लिए अधिक उपयुक्त है।
मारीआन Marerný

182

5 स्विफ्ट के लिए अद्यतन

हम शुरुआती अक्षर के माध्यम से उदाहरण चर का उपयोग करके प्रकार के नामों का सुंदर विवरण प्राप्त कर सकते हैं Stringऔर एक निश्चित वर्ग के नए ऑब्जेक्ट बना सकते हैं

जैसे, उदाहरण के लिए print(String(describing: type(of: object)))। जहाँ objectएक उदाहरण चर हो सकता है जैसे सरणी, एक शब्दकोश Int, ए NSDate, आदि।

क्योंकि NSObjectअधिकांश उद्देश्य-सी श्रेणी पदानुक्रमों का मूल वर्ग है, इसलिए आप 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

    }
}

इसके अलावा, एक बार जब हम कक्षा के नाम को स्ट्रिंग के रूप में प्राप्त कर सकते हैं, तो हम उस कक्षा की नई वस्तुओं को तुरंत निकाल सकते हैं :

// 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)

शायद यह किसी को वहाँ मदद करता है !.


2
यह स्वीकृत उत्तर होना चाहिए। धन्यवाद, मैं क्लास के नाम को प्रिंट करने का एक तरीका ढूंढ रहा था, जिसके लिए उसे तुरंत लिखना था, और यहाँ उत्तर मिला। धन्यवाद प्रिंट (स्ट्रिंग (BaseAsyncTask))
ब्रूनो

4
classNameAsStringके लिए सरलीकृत किया जा सकता है className, इसके लिए "नाम" ने अपने प्रकार को निहित किया है। theClassNamefacebook की कहानी के लिए simillar है, जिसे मूल रूप से thefacebook नाम दिया गया है।
डॉनसॉन्ग

"डाइसेशनरी" ... स्विफ्ट के शब्दकोश संग्रह का इतालवी संस्करण:]
एंड्रयू किर्ना

यह समाधान प्रत्येक क्लासटैग के लिए प्रोजेक्टनेम को प्रस्तुत करता है, अर्थात ProjectTest.MyViewController। मुझे इस परियोजना के नाम से कैसे छुटकारा मिलेगा? मुझे केवल वर्ग नाम चाहिए।
सज्जाद हिसैन खान

132

स्विफ्ट 5

यहाँ typeNameएक चर के रूप में प्राप्त करने के लिए विस्तार किया गया है (मूल्य प्रकार या संदर्भ प्रकार दोनों के साथ काम)।

protocol NameDescribable {
    var typeName: String { get }
    static var typeName: String { get }
}

extension NameDescribable {
    var typeName: String {
        return String(describing: type(of: self))
    }

    static var typeName: String {
        return String(describing: self)
    }
}

कैसे इस्तेमाल करे:

// Extend with class/struct/enum...
extension NSObject: NameDescribable {}
extension Array: NameDescribable {}
extension UIBarStyle: NameDescribable { }

print(UITabBarController().typeName)
print(UINavigationController.typeName)
print([Int]().typeName)
print(UIBarStyle.typeName)

// Out put:
UITabBarController
UINavigationController
Array<Int>
UIBarStyle

12
किसी भी विचार मैं क्यों MyAppName.MyClassName मिलता है? मैं केवल MyClassName में रुचि रखता हूं
एंड्रयू

@ क्या आप अपने मामले में अधिक विशिष्ट दे सकते हैं? मैं कई परियोजनाओं में इस एक्सटेंशन का उपयोग कर रहा हूं और उनमें से सभी का इरादा प्रतिक्रिया के रूप में है।
nahung89

1
वैसे अगर मैं इसे क्लास से कॉल करता हूँ तो यह MyClassName वापस कर देता है, लेकिन अगर मैं इसे एक विधि में लपेटता हूँ जो क्लास नाम स्ट्रिंग को लौटाता है और इसे दूसरी क्लास से कॉल करता है तो यह MyAppName.MyClassName वापस कर देता है। चारों ओर खोज करते समय मैंने देखा कि सभी वर्गों के नाम अलग-अलग हैं, इसलिए यदि आप इसे अपनी कक्षा के बाहर कहते हैं तो आपको MyClassName के बजाय MyAppName.MyClassName मिलता है। फिर आपको वर्ग नाम प्राप्त करने के लिए स्ट्रिंग हेरफेर पर भरोसा करना होगा।
एंड्रयू

1
बहुत उपयोगी विस्तार
हतोरी हनज़ो

@ और, वर्तमान काम के बारे में निश्चित नहीं है, लेकिन मुझे याद है, स्ट्रिंग (वर्णन: प्रकार: (स्वयं)) एक बिंदु पर ModuleName.ClassName को वापस करने के लिए उपयोग किया जाता है। मैं विभाजित था। चरित्र और अंतिम वस्तु प्राप्त की।
बैंगऑपरेटर

31

स्विफ्ट 3.0

String(describing: MyViewController.self)


2
वास्तव type(of: )में वहाँ एक overkill है, String(describing: MyViewController.self)पर्याप्त होगा
अलेक्जेंडर Vasenin

2
यह मेरे लिए <App_Name.ClassName: 0x79e14450> जैसे एक स्ट्रिंग बनाता है, जो आदर्श नहीं है
डग एमोस

है ना String.init(describing: MyViewController.self)?
इलियान ओनोफ्रेई

2
@ इयूलियनऑनफ्रेई, आप ऐसा कर सकते हैं, लेकिन initअनावश्यक है।
शिम

पूरी तरह से AppName उपसर्ग से छुटकारा! धन्यवाद
Yuchen

28

मेरा सुझाव है कि इस तरह के दृष्टिकोण ( बहुत Swifty ):

// Swift 3
func typeName(_ some: Any) -> String {
    return (some is Any.Type) ? "\(some)" : "\(type(of: some))"
}

// Swift 2
func typeName(some: Any) -> String {
    return (some is Any.Type) ? "\(some)" : "\(some.dynamicType)"
}

यह न तो आत्मनिरीक्षण और न ही मैनुअल डीमंग्लिंग ( कोई जादू! ) का उपयोग नहीं करता है ।


यहाँ एक डेमो है:

// Swift 3

import class Foundation.NSObject

func typeName(_ some: Any) -> String {
    return (some is Any.Type) ? "\(some)" : "\(type(of: some))"
}

class GenericClass<T> {
    var x: T? = nil
}

protocol Proto1 {
    func f(x: Int) -> Int
}


@objc(ObjCClass1)
class Class1: NSObject, Proto1 {
    func f(x: Int) -> Int {
        return x
    }
}

struct Struct1 {
    var x: Int
}

enum Enum1 {
    case X
}

print(typeName(GenericClass<Int>.self)) // GenericClass<Int>
print(typeName(GenericClass<Int>()))  // GenericClass<Int>

print(typeName(Proto1.self)) // Proto1

print(typeName(Class1.self))   // Class1
print(typeName(Class1())) // Class1
print(typeName(Class1().f)) // (Int) -> Int

print(typeName(Struct1.self)) // Struct1
print(typeName(Struct1(x: 1))) // Struct1
print(typeName(Enum1.self)) // Enum1
print(typeName(Enum1.X)) // Enum1

उन्होंने इसे स्विफ्ट 3.0 में बदल दिया। अब आप से स्ट्रिंग प्राप्त कर सकते हैंtype(of: self)
असद अली

स्विफ्ट 3 से अपडेट किया गया
वेर्डिवर

मुझे लगता है कि NSObject, enum, typealiase, फ़ंक्शन, var गुण और किसी भी प्रकार, यहां तक ​​कि स्थिरांक के आधार पर, किसी भी प्रकार का नाम पाने का यह सबसे अच्छा तरीका है। प्रकारों के लिए, आपको स्वयं का उपयोग करना होगा। उदाहरण के लिए, टाइपनाम (Int.self), टाइपनेम (true.self)। न ही आपको परियोजना के नाम के बारे में चिंता करने की ज़रूरत है (जैसे कि AppProj। [टाइपनेम]) बढ़िया!
डेविड.छू.का

23

यदि आपके पास टाइप है Foo, तो निम्न कोड आपको "Foo"स्विफ्ट 3 और स्विफ्ट 4 में देगा:

let className = String(describing: Foo.self) // Gives you "Foo"

यहाँ पर अधिकांश उत्तरों के साथ समस्या यह है कि वे आपको "Foo.Type"परिणामी स्ट्रिंग के रूप में देते हैं जब आपके पास किसी प्रकार का कोई उदाहरण नहीं होता है, जब आप वास्तव में चाहते हैं तो बस "Foo"। निम्नलिखित आपको देता है "Foo.Type", जैसा कि अन्य उत्तरों के एक समूह में बताया गया है।

let className = String(describing: type(of: Foo.self)) // Gives you "Foo.Type"

type(of:)यदि आप चाहें तो यह हिस्सा अनावश्यक है "Foo"


21

में स्विफ्ट 4.1 और अब स्विफ्ट 4.2 :

import Foundation

class SomeClass {
    class InnerClass {
        let foo: Int

        init(foo: Int) {
            self.foo = foo
        }
    }

    let foo: Int

    init(foo: Int) {
        self.foo = foo
    }
}

class AnotherClass : NSObject {
    let foo: Int

    init(foo: Int) {
        self.foo = foo
        super.init()
    }
}

struct SomeStruct {
    let bar: Int

    init(bar: Int) {
        self.bar = bar
    }
}

let c = SomeClass(foo: 42)
let s = SomeStruct(bar: 1337)
let i = SomeClass.InnerClass(foo: 2018)
let a = AnotherClass(foo: 1<<8)

यदि आपके पास कोई उदाहरण नहीं है:

String(describing: SomeClass.self) // Result: SomeClass
String(describing: SomeStruct.self) // Result: SomeStruct
String(describing: SomeClass.InnerClass.self) // Result: InnerClass
String(describing: AnotherClass.self) // Result: AnotherClass

यदि आपके पास एक उदाहरण है:

String(describing: type(of: c)) // Result: SomeClass
String(describing: type(of: s)) // Result: SomeStruct
String(describing: type(of: i)) // Result: InnerClass
String(describing: type(of: a)) // Result: AnotherClass

14

किसी ऑब्जेक्ट से स्विफ्ट क्लास का नाम लेने के लिए, उदाहरण के लिए var ऑब्जेक्ट: SomeClass (), उपयोग करें

String(describing: type(of: object))

वर्ग प्रकार से स्विफ्ट क्लास का नाम प्राप्त करने के लिए, SomeClass, का उपयोग करें:

String(describing: SomeClass.self)

आउटपुट:

"SomeClass"


13

आप इस तरह से कोशिश कर सकते हैं:

self.classForCoder.description()

यह महान काम करता है क्योंकि इसमें पूर्ण "नामस्थान" (उपयुक्त लक्ष्य सदस्यता उपसर्ग) भी शामिल है।
बोनांजाड्राइवर

BTW, मैंने "स्ट्रिंग (स्वयं)" का उपयोग करते हुए भी पाया, जहां स्वयं MyViewController कार्यों का एक उदाहरण है ... यह एक ही जानकारी प्रदान करता है ... Xcode 7.1।
BonanzaDriver

12

आप स्विफ्ट मानक लाइब्रेरी फ़ंक्शन का उपयोग _stdlib_getDemangledTypeNameइस तरह से कर सकते हैं:

let name = _stdlib_getDemangledTypeName(myViewController)

@NeilJaff क्या आप "सिर्फ एक वैकल्पिक स्ट्रिंग" से मतलब है? यह एक स्ट्रिंग लौटाता है और यह वैकल्पिक नहीं है।
जेर्नेज स्ट्रैसनर

3
यह दृष्टिकोण निजी APIs FYI में कक्षाओं के नाम वापस नहीं करता है। यह पहले सार्वजनिक आधार वर्ग का नाम लौटाएगा।
Tylerc230

मुझे यह संदेश मिला: अनसुलझे पहचानकर्ता का उपयोग '_stdlib_getDemangledTypeName'
Adobels

12

स्विफ्ट 4 में स्ट्रिंग के रूप में टाइप नाम प्राप्त करने के लिए (मैंने पिछले संस्करणों की जाँच नहीं की है), बस स्ट्रिंग प्रक्षेप का उपयोग करें:

"\(type(of: myViewController))"

आप .selfएक प्रकार पर ही उपयोग कर सकते हैं , और type(of:_)एक उदाहरण पर कार्य:

// Both constants will have "UIViewController" as their value
let stringFromType = "\(UIViewController.self)"
let stringFromInstance = "\(type(of: UIViewController()))"

8

दर्पण का उपयोग कर सकते हैं:

let vc = UIViewController()

String(Mirror(reflecting: vc).subjectType)

NB: इस विधि का उपयोग स्ट्रक्चर्स और एनम के लिए भी किया जा सकता है। एक डिस्प्लेसेल है जो इस बात का संकेत देता है कि संरचना किस प्रकार की है:

Mirror(reflecting: vc).displayStyle

वापसी एक पहेली है ताकि आप कर सकें:

Mirror(reflecting: vc).displayStyle == .Class

धन्यवाद। मेरे लिए यही काम आया। केवल एक चीज (कम से कम आईओएस 9 पर) यह है कि सब्जेक्ट टाइप "टाइप" में समाप्त हो रहा था, इसलिए मुझे स्ट्रिंग से उस हिस्से को निकालना पड़ा।
निकोले सुवाँधिवे

8

स्विफ्ट 5.1

आप वर्ग, संरचना, एनम, प्रोटोकॉल और NSObject नाम प्राप्त कर सकते हैं Self.self

print("\(Self.self)")

ध्यान दें कि यह मॉड्यूल नाम (अलग-अलग String(describing: type(of: self)))
Ixx

7

स्विफ्ट 3.0: आप इस तरह से एक एक्सटेंशन बना सकते हैं .. यह प्रोजेक्ट नाम के बिना वर्ग नाम वापस देता है

extension NSObject {
    var className: String {
        return NSStringFromClass(self as! AnyClass).components(separatedBy: ".").last ?? ""
    }

    public class var className: String {
        return NSStringFromClass(self).components(separatedBy: ".").last ?? ""
    }
}

जब मैं इसका उपयोग करने का प्रयास करता हूं तो मुझे यह त्रुटि मिलती है: 'Swift.AnyObject.Type' (0x7fb96bc0dec0) प्रकार 'ProjectName.MyViewController' (0x1020409e8) का मान नहीं डाल सका।
tylerSF

6

आप NSObjectProtocolस्विफ्ट 4 में इस तरह से विस्तार कर सकते हैं :

import Foundation

extension NSObjectProtocol {

    var className: String {
        return String(describing: Self.self)
    }
}

यह गणना की गई चर classNameको सभी वर्गों के लिए उपलब्ध कराएगा। एक के अंदर इस का उपयोग print()में CalendarViewControllerप्रिंट होगा "CalendarViewController"कंसोल में।


4

मैं कुछ समय के लिए इस उत्तर को खोज रहा हूं। मैं GKStateMachine का उपयोग करता हूं और राज्य परिवर्तनों का निरीक्षण करना पसंद करता हूं और सिर्फ कक्षा का नाम देखने का एक आसान तरीका चाहता हूं। मुझे यकीन नहीं है कि यह सिर्फ iOS 10 या स्विफ्ट 2.3 है, लेकिन उस वातावरण में, निम्नलिखित वही करता है जो मैं चाहता हूं:

let state:GKState?
print("Class Name: \(String(state.classForCoder)")

// Output:    
// Class Name: GKState


3

स्ट्रिंग के रूप में वर्ग का नाम पाने के लिए अपनी कक्षा को निम्नलिखित के रूप में घोषित करें

@objc(YourClassName) class YourClassName{}

और सिंटैक्स का उपयोग करके वर्ग नाम प्राप्त करें

NSStringFromClass(YourClassName)

3

reflect().summaryकक्षा स्व या आवृत्ति डायनेमिक टाइप पर प्रयास करें । डायनामिक टाइप होने से पहले वैकल्पिक को अनप्लग करें अन्यथा डायनेमिक टाइप वैकल्पिक आवरण है।

class SampleClass { class InnerClass{} }
let sampleClassName = reflect(SampleClass.self).summary;
let instance = SampleClass();
let instanceClassName = reflect(instance.dynamicType).summary;
let innerInstance = SampleClass.InnerClass();
let InnerInstanceClassName = reflect(innerInstance.dynamicType).summary.pathExtension;
let tupleArray = [(Int,[String:Int])]();
let tupleArrayTypeName = reflect(tupleArray.dynamicType).summary;

सारांश एक वर्ग पथ है जिसमें वर्णित सामान्य प्रकार हैं। सारांश से एक साधारण वर्ग का नाम पाने के लिए इस विधि को आजमाएँ।

func simpleClassName( complexClassName:String ) -> String {
    var result = complexClassName;
    var range = result.rangeOfString( "<" );
    if ( nil != range ) { result = result.substringToIndex( range!.startIndex ); }
    range = result.rangeOfString( "." );
    if ( nil != range ) { result = result.pathExtension; }
    return result;
}

3

उपरोक्त समाधान मेरे लिए काम नहीं किया। उत्पादित ज्यादातर मुद्दों में कई टिप्पणियों का उल्लेख है:

MyAppName.ClassName

या

MyFrameWorkName.ClassName

इस समाधान XCode 9, स्विफ्ट 3.0 पर काम किया:

मैंने इसे नाम दिया है classNameCleanedइसलिए इसे एक्सेस करना आसान है और भविष्य के className()परिवर्तनों के साथ संघर्ष नहीं करता है :

extension NSObject {

static var classNameCleaned : String {

    let className = self.className()
    if className.contains(".") {
        let namesArray = className.components(separatedBy: ".")
        return namesArray.last ?? className
    } else {
        return self.className()
    }

}

}

उपयोग:

NSViewController.classNameCleaned
MyCustomClass.classNameCleaned

2

स्विफ्ट 3.0 (macOS 10.10 और बाद में), आप इसे क्लासनेम से प्राप्त कर सकते हैं

self.className.components(separatedBy: ".").last!

1
जहां तक ​​मैं बता सकता हूं कि स्विफ्ट कक्षाओं में कोई अंतर्निहित वर्गीय संपत्ति नहीं है। क्या आपने किसी चीज़ से उपश्रम किया?
शिम

@shim className को फाउंडेशन में घोषित किया गया है लेकिन ऐसा लगता है कि यह केवल macOS 10.10 और बाद में उपलब्ध है। मैंने सिर्फ अपना उत्तर संपादित किया।
थान

1
हम्म, यह अजीब है। वे इसे आईओएस में शामिल क्यों नहीं करेंगे? यह भी ध्यान दें कि यह NSObject developer.apple.com/reference/objectivec/nsobject/…
shim

2

मैंने type(of:...)स्विफ्ट 3 के साथ प्लेग्राउंड में कोशिश की । यह मेरा परिणाम है। यह कोड प्रारूप संस्करण है।

print(String(describing: type(of: UIButton.self)))
print(String(describing: type(of: UIButton())))
UIButton.Type
UIButton

यह केवल वर्ग नाम निर्धारित करने के लिए एक उदाहरण को तत्काल बर्बाद करने के लिए बेकार है।
सेटहैरी

@sethfri मैं गतिशील प्रकार निर्धारित करने के लिए इसका उपयोग करता हूं।
लुमियालेक्स

मुझे अभी भी समझ में नहीं आ रहा है कि आपको कक्षा की प्रकार की जानकारी प्राप्त करने के लिए सिर्फ एक उदाहरण बनाने की आवश्यकता क्यों है
sethfri


2

क्लास वर्जन के लिए इस तरह का उदाहरण। बंडल का नाम शामिल न करें।

extension NSObject {
    class var className: String {
        return "\(self)"
    }
}

1

यदि आपको आम का नाम पसंद नहीं है, तो आप अपना खुद का नाम निर्धारित कर सकते हैं:

@objc(CalendarViewController) class CalendarViewController : UIViewController {
    // ...
}

हालांकि, लंबे समय में यह बेहतर होगा कि आम के नाम को पार्स किया जाए। प्रारूप मानक और सार्थक है और इसमें बदलाव नहीं होगा।


नहीं, यह मेरे वर्ग के लिए नहीं है, यह (ExistentialMetatype) - अनिर्धारित रनटाइम व्यवहार पर निर्भर करना हमेशा खतरनाक होता है, खासकर तेज गति के लिए क्योंकि यह अभी भी अपेक्षाकृत शुरुआती चरण में है।
superarts.org

1

कभी-कभी अन्य समाधान एक गैर-उपयोगी नाम देंगे जो इस बात पर निर्भर करता है कि आप किस वस्तु को देखने की कोशिश कर रहे हैं। उस स्थिति में आप निम्न का उपयोग करके एक स्ट्रिंग के रूप में वर्ग नाम प्राप्त कर सकते हैं।

String(cString: object_getClassName(Any!))

⌘ कुछ संबंधित विधियों को देखने के लिए xcode में फ़ंक्शन पर क्लिक करें जो काफी उपयोगी हैं। या यहां देखें https://developer.apple.com/reference/objectivec/objective_c_functions


1

स्विफ्ट 5 आप स्ट्रिंग के साथ एक स्ट्रिंग के रूप में class_name प्राप्त कर सकते हैं (वर्णन: स्व। स्वयं)

print(String(describing: Self.self))

0

मैं इसे स्विफ्ट 2.2 में इस्तेमाल करता हूं

guard let currentController = UIApplication.topViewController() else { return }
currentController.classForCoder.description().componentsSeparatedByString(".").last!

0

स्विफ्ट 5.1: -

आप स्ट्रिंग के रूप में ऑब्जेक्ट का वर्ग नाम प्राप्त करने के लिए सामान्य फ़ंक्शन का भी उपयोग कर सकते हैं

struct GenericFunctions {
 static func className<T>(_ name: T) -> String {
        return "\(name)"
    }

}

इस फ़ंक्शन को निम्नलिखित का उपयोग करके कॉल करें: -

let name = GenericFunctions.className(ViewController.self)

हैप्पी कोडिंग :)


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.