সুইফটে স্ট্রিং হিসাবে বস্তুর শ্রেণীর নাম পান


320

Stringব্যবহার হিসাবে একটি বস্তুর শ্রেণিকাম প্রাপ্তি :

object_getClassName(myViewController)

এরকম কিছু ফেরত দেয়:

_TtC5AppName22CalendarViewController

আমি খোঁজ করছি বিশুদ্ধ সংস্করণ: "CalendarViewController"। পরিবর্তে আমি কীভাবে ক্লাসের নামটির একটি পরিষ্কার স্ট্রিং পেতে পারি ?

আমি এটি সম্পর্কে কিছু প্রশ্নের চেষ্টা পেয়েছি তবে আসল উত্তর পাওয়া যায় নি। এটা কি আদৌ সম্ভব নয়?


বিকল্পভাবে… এই চেহারাটির জন্য কার্যকর পার্সার ফাংশনটি কেমন হবে?
বার্ড

যদি আপনি কোনও বিষয় নির্দিষ্ট শ্রেণীর কিনা তা পরীক্ষা করতে চান তবে এই উত্তরটি দেখুন
অর্থ-বিষয়গুলি

উত্তর:


528

উদাহরণস্বরূপ স্ট্রিং :

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
এক্সকোড 7.৩.১ এ এবং সুইফট ২.২ এ এটি ব্যবহার করে নিম্নলিখিতটি তৈরি করা হয় যা কোনও আদর্শ নয়। '' লেট নাম = স্ট্রিং (স্ব) নাম স্ট্রিং "<মাই অ্যাপনেম.মাই ক্লাসনাম: 0x #########" ""
কোডবেণ্ডার

13
সুইফ্ট 3-তে, সঠিক উত্তরটি কল করতে হবে String(describing: MyViewController.self)যা নীচে কয়েকটি উত্তরে উল্লিখিত হয়েছে।
অমিতাবি

10
তবে এটি "মাইভিউকন্ট্রোলআরটিওয়াইপিইপি" দেয়!
অরকেনস্টেইন

3
@ রুডলফএডামকোভিč হ্যাঁ, এটি সত্য হবে। কিন্তু আমি স্পষ্টভাবে বর্গ নাম লেখা (আমি যদি বর্গ নামান্তর পছন্দ না Fooকরার Foo2কিন্তু একটি বর্গ তৈরি Fooঅন্যত্র যে শক্তি ব্রেক কোড,)। সাবক্লাসিংয়ের ক্ষেত্রে আপনাকে যে কোনওটি ব্যবহার করা উচিত type(of:)বা Type.selfআপনার প্রয়োজন অনুসারে কী উপযুক্ত তা নির্ভর করে। সম্ভবত type(of:)শ্রেণীর নাম পাওয়ার জন্য আরও উপযুক্ত।
মারিওন আর্নে

182

সুইফট 5 আপডেট হয়েছে

ইনিশিয়ালাইজারের মাধ্যমে উদাহরণ ভেরিয়েবলটি ব্যবহার করে আমরা টাইপ নামের সুন্দর বর্ণনা পেতে পারি Stringএবং একটি নির্দিষ্ট শ্রেণীর নতুন অবজেক্ট তৈরি করতে পারি

যেমন, উদাহরণস্বরূপ print(String(describing: type(of: object)))। অ্যারে, অভিধান, একটি , ক , ইত্যাদির মতো উদাহরণ ভেরিয়েবল যেখানে objectথাকতে পারেIntNSDate

যেহেতু 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
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ধন্যবাদ, আমি ক্লাসের নামটি ইনস্ট্যান্ট না করে মুদ্রণের একটি উপায় খুঁজছিলাম এবং উত্তরটি এখানে পেয়েছি found ধন্যবাদ মুদ্রণ (স্ট্রিং (বেসএসেকটাস্ক))
ব্রুনো কোয়েলহো

4
classNameAsStringসরলীকরণ করা যেতে পারে className, কারণ "নাম" এর প্রকারটি বোঝায়। theClassNameফেসবুকের গল্পের সিমিলার, এটির নাম মূলত থেসবুক।
ডনসং

"ডিকশনারি" ... সুইফট এর অভিধান সংগ্রহের ইতালিয়ান সংস্করণ:]
অ্যান্ড্রু কির্না

এই সমাধান প্রতিটি classTag জন্য projectname prepending, অর্থাত্ 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
আমি মাই অ্যাপ্লনেম.মাইক্লাসনেমকে এর বাইরে পেয়েছি কেন এমন কোনও ধারণা? আমি কেবল মাই ক্লাসনামে আগ্রহী
অ্যান্ড্রু

@ অ্যান্ড্রু আপনি কি আপনার ক্ষেত্রে আরও নির্দিষ্ট দিতে পারেন? আমি অনেকগুলি প্রকল্পে এই এক্সটেনশনটি ব্যবহার করছি এবং এটির মতো সমস্তগুলি প্রতিক্রিয়া অনুসারে।
nahung89

1
ভাল আমি যদি ক্লাস থেকে নিজেই এটি কল করি তবে এটি MyClassName ফেরত দেয় তবে আমি যদি এমন কোনও পদ্ধতিতে আবৃত করি যা ক্লাস নামের স্ট্রিংটি দেয় এবং এটি অন্য ক্লাস থেকে কল করে এটি MyAppName.MyClassName প্রদান করে। আশেপাশে অনুসন্ধান করার সময় আমি দেখতে পেয়েছি যে সমস্ত ক্লাসগুলি স্পষ্টতই নামগতির হয়, সুতরাং আপনি যদি এটি আপনার শ্রেণির বাইরে কল করেন তবে আপনি MyClassName এর পরিবর্তে MyAppName.MyClassName পাবেন। তারপরে আপনাকে ক্লাসের নাম পেতে স্ট্রিং ম্যানিপুলেশনের উপর নির্ভর করতে হবে।
অ্যান্ড্রু

1
খুব দরকারী এক্সটেনশন
হাটোরি হানজি

@ অ্যান্ড্রু, বর্তমানের কাজ সম্পর্কে নিশ্চিত নন, তবে আমার মনে আছে, স্ট্রিং (বর্ণনা: প্রকার (এর: স্ব)) এক পর্যায়ে মডিউলনেম.ক্লাসনাম ফেরত দিতে ব্যবহৃত হয়েছিল। আমি উপর ভিত্তি করে বিভক্ত ছিল। অক্ষর এবং শেষ অবজেক্টটি এনেছে।
BangOperator

31

সুইফট 3.0

String(describing: MyViewController.self)


2
আসলে type(of: )সেখানে ওভারকিল, String(describing: MyViewController.self)যথেষ্ট হবে
আলেকজান্ডার ভ্যাসেনিন

2
এটি আমার জন্য <App_Name.ClassName: 0x79e14450> এর মতো একটি স্ট্রিং তৈরি করে, যা আদর্শ নয়
ডগ আমোস

তাই না String.init(describing: MyViewController.self)?
Iulian Onofrei

2
@ ইউলিয়ানঅনফ্রেই, আপনি এটি করতে পারেন, তবে এটি initঅপ্রয়োজনীয়।
শিম

সম্পূর্ণরূপে অ্যাপনাম উপসর্গ থেকে মুক্তি পান! ধন্যবাদ
yuchen

28

আমি এই জাতীয় পদ্ধতির পরামর্শ দিচ্ছি ( খুব সুইফটি ):

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

তারা এটি সুইফট ৩.০ এ পরিবর্তন করেছে। এখন আপনি স্ট্রিংটি পেতে পারেনtype(of: self)
আসাদ আলী

সুইফট 3 এ আপডেট হয়েছে
ওয়েলডিভার

আমি মনে করি এটি টাইপ নাম পাওয়ার সর্বোত্তম উপায়: এনএসবজেক্ট, এনাম, টাইপালিয়াস, ফাংশন, বিভিন্ন বৈশিষ্ট্য এবং কোনও ধরণের, এমনকি ধ্রুবকের উপর ভিত্তি করে শ্রেণীর কোনও উদাহরণ। প্রকারের জন্য, আপনাকে নিজের ব্যবহার করতে হবে। উদাহরণস্বরূপ, টাইপনাম (ইন্ট.সেলফ), টাইপনাম (ট্রু.সেলফ)। বা অংশ হিসাবে প্রকল্পের নাম সম্পর্কে আপনাকে উদ্বিগ্ন হওয়ার দরকার নেই (যেমন অ্যাপপ্রোজ। [টাইপনাম]) দুর্দান্ত!
ডেভিড.চু.সি.এ

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

কোনও অবজেক্ট থেকে একটি সুইফ্ট শ্রেণীর নাম পেতে, যেমন ভর অবজেক্টের জন্য: সুমারক্লাস (), ব্যবহার করুন

String(describing: type(of: object))

একটি শ্রেণীর ধরণ থেকে একটি সুইফ্ট শ্রেণীর নাম পেতে, যেমন সামার ক্লাস, ব্যবহার করুন:

String(describing: SomeClass.self)

আউটপুট:

"SomeClass"


13

আপনি এইভাবে চেষ্টা করতে পারেন:

self.classForCoder.description()

এতে পুরো "নেমস্পেস" (উপযুক্ত লক্ষ্য সদস্যপদ উপস্থাপনা) অন্তর্ভুক্ত হওয়ায় এটি দুর্দান্ত কাজ করে।
BonanzaDriver

বিটিডাব্লু, আমি "স্ট্রিং (স্ব)" ব্যবহার করে এমনটিও পেয়েছি যেখানে স্ব মাইভিউকন্ট্রোলার খুব কাজ করে তার উদাহরণ ... এটি একই তথ্য সরবরাহ করে ... এক্সকোড 7.১।
BonanzaDriver

12

আপনি সুইফ স্ট্যান্ডার্ড লাইব্রেরি ফাংশনটি এর _stdlib_getDemangledTypeNameমতো ব্যবহার করতে পারেন :

let name = _stdlib_getDemangledTypeName(myViewController)

@ নীলজাফ "" কেবলমাত্র একটি optionচ্ছিক স্ট্রিং "বলতে আপনার অর্থ কী? এটি একটি স্ট্রিং দেয় এবং এটি optionচ্ছিক নয়।
জের্নেজ স্ট্র্যাসনার

3
এই পদ্ধতির FYI বেসরকারী API- এর ক্লাসগুলির নাম ফেরত দেয় না। এটি প্রথম পাবলিক বেস শ্রেণির নাম ফিরিয়ে দেবে।
টাইলার 230

আমি বার্তাটি পেয়েছি: অমীমাংসিত সনাক্তকারী '_stdlib_getDemangledTypeName'
অ্যাডোবেলস

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)

এনবি: এই পদ্ধতিটি স্ট্রাক্টস এবং এনামগুলির জন্যও ব্যবহার করা যেতে পারে। এখানে একটি ডিসপ্লেস্টাইল রয়েছে যা কী ধরণের কাঠামোর একটি ইঙ্গিত দেয়:

Mirror(reflecting: vc).displayStyle

রিটার্নটি একটি এনাম যাতে আপনি এটি করতে পারেন:

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

ধন্যবাদ। এটাই আমার পক্ষে কাজ করেছে। একমাত্র জিনিস (কমপক্ষে আইওএস 9 এ) হ'ল সাবজেক্টটাইপটি ".Type" এ শেষ হচ্ছিল, সুতরাং আমাকে সেই অংশটি স্ট্রিং থেকে সরিয়ে ফেলতে হয়েছিল।
নিকোলে সুভান্দজিয়েভ

8

সুইফট 5.1

আপনি ক্লাস, স্ট্রাক্ট, এনাম, প্রোটোকল এবং এনএসবজেক্টের নামগুলি পেতে পারেন Self.self

print("\(Self.self)")

দ্রষ্টব্য যে এটি মডিউলটির নামটি (আগে আলাদাভাবে String(describing: type(of: self)))
প্রবর্তন

7

সুইফট ৩.০: আপনি এর মতো একটি এক্সটেনশন তৈরি করতে পারেন .. এটি প্রকল্পের নাম ছাড়াই শ্রেণীর নাম দেয়

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

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

আমি এটি ব্যবহার করার চেষ্টা করার সময় আমি ত্রুটিটি পেয়েছি: 'প্রজেক্টনাম.মাইভিউকন্ট্রোলার' (0x1020409e8) টাইপের মান 'সুইফট.আনিঅবজেক্ট.টাইপ' (0x7fb96fc0dec0) তে কাস্ট করা যায়নি।
টাইলারএসএফ 21

6

আপনি NSObjectProtocolসুইফট 4 এ এর ​​মতো প্রসারিত করতে পারেন :

import Foundation

extension NSObjectProtocol {

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

এটি গণিত ভেরিয়েবলকে classNameসমস্ত শ্রেণিতে উপলব্ধ করবে । এটি একটি print()ইন এর ব্যবহার করে কনসোলে CalendarViewControllerমুদ্রিত হবে "CalendarViewController"


4

আমি এই উত্তরটি সন্ধান করছি এবং কিছুক্ষণের জন্য। আমি GKStateMachine ব্যবহার করি এবং রাষ্ট্রীয় পরিবর্তনগুলি পর্যবেক্ষণ করতে পছন্দ করি এবং কেবল শ্রেণীর নাম দেখতে একটি সহজ উপায় চাই। আমি নিশ্চিত যে এটি কেবল আইওএস 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;

সংক্ষিপ্ত বিবরণ জেনেরিক ধরণের সহ একটি শ্রেণীর পথ। সারাংশ থেকে একটি সাধারণ শ্রেণীর নাম পেতে এই পদ্ধতিটি ব্যবহার করে দেখুন try

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

এই সমাধানগুলি এক্সকোড 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 (ম্যাকোস 10.10 এবং তারপরে), আপনি এটি ক্লাসনেম থেকে পেতে পারেন

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

1
আমি যতদূর বলতে পারি সুইফ্ট ক্লাসে অন্তর্নির্মিত শ্রেণির নাম সম্পত্তি নেই। আপনি কিছু থেকে subclass করেছেন?
shim

@ শিম ক্লাসনাম ফাউন্ডেশনে ঘোষিত হয়েছে তবে মনে হচ্ছে এটি কেবল ম্যাকোস ১০.১০ এবং তার পরে পাওয়া যাবে। আমি আমার উত্তরটি সম্পাদনা করেছি ited
থানহ ভি ট্রেন

1
হুঁ, এটা খুব অদ্ভুত। তারা এটিকে আইওএসে অন্তর্ভুক্ত করবে না কেন? এটি নোট করুন এটি NSObject বিকাশকারী.অ্যাপল.
com


2

ক্লাস ভের জন্য এই ধরণের উদাহরণ। বান্ডিলের নাম অন্তর্ভুক্ত করবেন না।

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

1

আপনি যদি ম্যাংলেড নামটি পছন্দ না করেন তবে আপনি নিজের নামটি লিখে দিতে পারেন:

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

তবে, দীর্ঘমেয়াদে ম্যাঙ্গলেড নামটি পার্স করতে শেখা ভাল। ফর্ম্যাটটি স্ট্যান্ডার্ড এবং অর্থবহ এবং এটি পরিবর্তিত হবে না।


না এটি নয়, আমার ক্লাসের জন্য এটি ফিরে আসে (অস্তিত্ববাদী মেট্যাটাইপ) - অপ্রকাশিত রানটাইম আচরণের উপর নির্ভর করা সর্বদা বিপজ্জনক, বিশেষত দ্রুতগতির জন্য যেহেতু এটি এখনও তুলনামূলক প্রাথমিক পর্যায়ে রয়েছে।
superarts.org

1

কখনও কখনও অন্যান্য সমাধানগুলি আপনি কোন বস্তুটি দেখার চেষ্টা করছেন তার উপর নির্ভর করে কোনও অ-দরকারী নাম দেবে। সেক্ষেত্রে আপনি ক্লাসের নামটি নিম্নলিখিতটি ব্যবহার করে স্ট্রিং হিসাবে পেতে পারেন।

String(cString: object_getClassName(Any!))

Related কিছু সম্পর্কিত পদ্ধতি যা মোটামুটি দরকারী তা দেখতে এক্সকোডে ফাংশনটিতে ক্লিক করুন। বা এখানে দেখুন https://developer.apple.com/references/objectivec/objective_c_function


1

আমি type(of:...)সুইফট 3 দিয়ে প্লেগ্রাউন্ডে চেষ্টা করেছি এটি আমার ফলাফল। এটি কোড ফর্ম্যাট সংস্করণ।

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

কেবল শ্রেণীর নাম নির্ধারণ করার জন্য কোনও দৃষ্টান্ত ইনস্ট্যান্ট করা এটি অপচয়মূলক।
sethfri

@seffri আমি গতিশীল প্রকার নির্ধারণ করতে এটি ব্যবহার করি।
Lumialxk

আমি এখনও বুঝতে পারছি না কেন কেবল ক্লাসের ধরণের তথ্য পেতে আপনাকে কেন একটি উদাহরণ তৈরি করতে হবে
setffri

1

সুইফ্ট 5 আপনি স্ট্রিংয়ের সাথে স্ট্রিং হিসাবে ক্লাসের নাম পেতে পারেন (বর্ণনা: স্বয়ংঃ নিজেই)

print(String(describing: Self.self))


0

সুইফ্ট 5.1: -

স্ট্রিং হিসাবে বস্তুর শ্রেণীর নাম পাওয়ার জন্য আপনি জেনেরিক ফাংশনও ব্যবহার করতে পারেন

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

}

নিম্নলিখিত ব্যবহার করে এই ফাংশন কল করুন: -

let name = GenericFunctions.className(ViewController.self)

শুভ কোডিং :)


-1

আমার ক্ষেত্রে স্ট্রিং (বর্ণনা: স্ব) এমন কিছু ফেরত দিয়েছে:

<মাই_প্রজেক্ট। এক্সাম্পলভিউ কনট্রোলার: 0x10b2bb2b0>

তবে আমি getSimpleNameঅ্যান্ড্রয়েডে কিছু পছন্দ করতে চাই ।

সুতরাং আমি একটু এক্সটেনশন তৈরি করেছি:

extension UIViewController {

    func getSimpleClassName() -> String {
        let describing = String(describing: self)
        if let dotIndex = describing.index(of: "."), let commaIndex = describing.index(of: ":") {
            let afterDotIndex = describing.index(after: dotIndex)
            if(afterDotIndex < commaIndex) {
                return String(describing[afterDotIndex ..< commaIndex])
            }
        }
        return describing
    }

}

এবং এখন এটি ফিরে আসে:

ExampleViewController

ইউআইভিউকন্ট্রোলারের পরিবর্তে এনএসবজেক্ট বাড়ানোও কাজ করা উচিত। উপরের কাজটিও ব্যর্থ-নিরাপদ :)


আপনার ক্লাসের পরিবর্তে ক্লাসের নামের একটি উদাহরণ পাস করার কারণ এটি উপরের উদাহরণে উদাহরণস্বরূপ ভিউকন্ট্রোলআরফেল্ফ করা উচিত
লুক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.