সুইফট ভাষা এনএসক্লাসফ্রস্ট্রিং


83

কীভাবে সুইফট ল্যাঙ্গুয়েজে প্রতিবিম্ব অর্জন করবেন ?

আমি কীভাবে কোনও ক্লাস ইনস্ট্যান্ট করতে পারি

[[NSClassFromString(@"Foo") alloc] init];

4
এর মতো চেষ্টা করুন, যদি ইমপ্লিমেন্টেশন ক্লাস: এনএসবজেক্ট.টাইপ = এনএসক্লাসফ্রস্ট্রিং (ক্লাসনাম) হিসাবে? এনএসবজেক্ট.টাইপ {বাস্তবায়নক্লাস.init ()}
পুষ্প রাজা

উত্তর:


37

এখানে কম হ্যাকির সমাধান: https://stackoverflow.com/a/32265287/308315

নোট করুন যে সুইফ্ট ক্লাসগুলি এখন "মাইভিউকন্ট্রোলার" এর পরিবর্তে নামকরণ করা হয়েছে এটি "অ্যাপনাম.মাইভিউকন্ট্রোলার" হবে


এক্সকোডি 6-বিটা 6/7 থেকে অবহেলিত

এক্সকোড 6-বিটা 3 ব্যবহার করে সমাধানটি বিকশিত হয়েছিল

এডউইন ভারমিরের উত্তরের জন্য ধন্যবাদ আমি এটি করে ওফজে-সি ক্লাসে সুইফ্ট ক্লাস ইনস্ট্যান্ট করার জন্য কিছু তৈরি করতে সক্ষম হয়েছি:

// swift file
// extend the NSObject class
extension NSObject {
    // create a static method to get a swift class for a string name
    class func swiftClassFromString(className: String) -> AnyClass! {
        // get the project name
        if  var appName: String? = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleName") as String? {
            // generate the full name of your class (take a look into your "YourProject-swift.h" file)
            let classStringName = "_TtC\(appName!.utf16count)\(appName)\(countElements(className))\(className)"
            // return the class!
            return NSClassFromString(classStringName)
        }
        return nil;
    }
}

// obj-c file
#import "YourProject-Swift.h"

- (void)aMethod {
    Class class = NSClassFromString(key);
    if (!class)
        class = [NSObject swiftClassFromString:(key)];
    // do something with the class
}

সম্পাদনা

আপনি এটি খাঁটি আপত্তি-সিতেও করতে পারেন:

- (Class)swiftClassFromString:(NSString *)className {
    NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
    NSString *classStringName = [NSString stringWithFormat:@"_TtC%d%@%d%@", appName.length, appName, className.length, className];
    return NSClassFromString(classStringName);
}

আমি আশা করি এটি কারও সাহায্য করবে!


4
বিটা 7 থেকে শুরু করে এটি আর কাজ করবে না N সুতরাং আপনি কোডটি ব্যবহার করতে পারলেন: var অ্যাপনাম: স্ট্রিং = এনএসবান্ডেল.মাইনবান্ডেল ()। অবজেক্টফরইনফো অভিধানিয়ানকি ("সিএফবান্ডেলনাম") স্ট্রিং হিসাবে? দিন classStringName: স্ট্রিং = NSStringFromClass (theObject.dynamicType) আগমন classStringName.stringByReplacingOccurrencesOfString (APPNAME + withString: "", বিকল্প: NSStringCompareOptions.CaseInsensitiveSearch, পরিসীমা: "।" শূন্য)
এডুইন Vermeer

@ কেভিনডেলর্ড আমি আপনার কোডটি আমার কোডটিতে ব্যবহার করেছি। তবে অ্যাপনাম ভেরিয়েবলটি যখন তার নামে একটি স্থান থাকে তখন সঠিক মানটি দেয় না। এটি ঠিক করার কোন ধারণা? "অ্যাপ_নাম" এর পরিবর্তে প্রাক্তন "অ্যাপের নাম"
লোডেক্স

কাউন্টএলমেন্টস ফাংশনটি খুঁজে পাই না। এই কোন সাহায্য?
C0D3

পরিবর্তে ক্লাসস্ট্রিংনেমের জন্য এটি ব্যবহার করুন: শ্রেণি স্ট্রিংনাম = "_TtC (অ্যাপনাম! .Characters.count) (অ্যাপনাম) (শ্রেণী নাম) (শ্রেণীর নাম)"
শ্রেণি নাম

@ লোয়েডেক্স, যদি আপনার এক্সিকিউটেবল নামের মধ্যে জায়গা থাকে তবে এটি কাজ করে না। আপনার স্পেসগুলি আন্ডারস্কোর সহ প্রতিস্থাপন করতে হবে। এটি (কিছুটা বিভ্রান্তিকর) ব্লগ পোস্টে এটি প্রস্তাবিত হয়েছিল: মাঝারি.com/@maximbilan/…। পোস্টে কোডটি কাজ করেছিল তবে প্রকৃত পোস্টে অ্যাপ্লিকেশন এবং টার্গেটের নাম ব্যবহার করার বিষয়ে কথা হয়েছিল যা তাদের কোডের চেয়ে আলাদা ছিল।
আটকে

57

আপনাকে অবশ্যই @objc(SwiftClassName)আপনার সুইফ্ট ক্লাসের উপরে রাখতে হবে ।
পছন্দ:

@objc(SubClass)
class SubClass: SuperClass {...}

4
NSClassFromString()ফাংশনটির জন্য @objcঅ্যাট্রিবিউশন দ্বারা নির্দিষ্ট নাম প্রয়োজন ।
eonil

4
আশ্চর্যজনক, এত ছোট একটি জিনিস আমার মানসিক সুস্থতায় এত বড় প্রভাব ফেলছে!
অ্যাড্রিয়ান_এইচ

4
@Bjc জিনিসটি তাদের শ্রেণীর নামের উপরে করার পরে কেউ কীভাবে এনএসক্লাসফ্রমস্ট্রিং () ব্যবহার করতে পারেন তা দেখিয়ে দিতে পারেন। আমি সবেমাত্র কোনও ক্লাস পাই! ফিরে এসেছেন
রায়ান বোব্রোস্কি

এটা আমার জন্য কাজ করে. তবে আমার কেন একটি প্রশ্ন আছে কেন @objc(SubClass)কাজ করে @objc class SubClass?
প্যানফিল্ড

সুইফ্ট ডক থেকে @ প্ল্যানফিল্ড: "অবজেক্ট অ্যাট্রিবিউট allyচ্ছিকভাবে একটি একক অ্যাট্রিবিউট আর্গুমেন্টকে গ্রহণ করে, যার মধ্যে একটি শনাক্তকারী থাকে identif সুতরাং, পার্থক্যটি হল কীভাবে আমাদের সুইফ্ট সাবক্লাসটি নামটি পায় এটি উদ্দেশ্য @objc class SubClassসিটির জন্য দৃশ্যমান হবে the ফর্মটিতে নামটি সাবক্লাস নামের মতোই বোঝানো হয়েছে। এবং @objc(SubClass) class SubClassফর্ম এটি সরাসরি নির্দিষ্ট করা হয়। আমার ধারণা, সংকলকটি কোনও কারণে প্রথম ফর্মটিতে নিজেই এটি বের করতে পারে না।
ভোইগার

56

এইভাবে আমি ক্লাস নাম অনুসারে ইউআইভিউউকন্ট্রোলার উদ্ভব করেছি

var className = "YourAppName.TestViewController"
let aClass = NSClassFromString(className) as! UIViewController.Type
let viewController = aClass()

আরও তথ্য এখানে

আইওএস 9 এ

var className = "YourAppName.TestViewController"
let aClass = NSClassFromString(className) as! UIViewController.Type
let viewController = aClass.init()

11
যদি অ্যাপের
নামটিতে

@ রিগেলচেন চমৎকার সমাধানের জন্য ধন্যবাদ তবে আমাদের যদি কেবল টাইপ (টেস্টভিউ কনট্রোলার) দরকার হয় এবং প্রতিবার এটি আরম্ভ করতে না চান তবে আমাদের কী করা উচিত?
আরগাপিকে

@ রায়ানহিটনার চমৎকার সমাধানের জন্য ধন্যবাদ তবে আমাদের যদি কেবল টাইপ (টেস্টভিউ কনট্রোলার) দরকার হয় এবং প্রতিবার এটি আরম্ভ করতে না চান তবে আমাদের কী করা উচিত?
আরগাপিকে

@ আরগাপ একটি সিঙ্গলটন তৈরি করুন এবং এটিতে অ্যাক্সেস করুন: দেখুন কনকন্ট্রোলার = aClass.sharedInstance ()
মাহবুদজ

27

আপডেট: বিটা 6 দিয়ে শুরু করে এনএসএসটিংফ্রমক্লাস আপনার বান্ডিলের নাম এবং ডট দ্বারা পৃথক শ্রেণীর নাম ফিরিয়ে দেবে। সুতরাং এটি MyApp.MyClass এর মতো কিছু হবে

সুইফ্ট ক্লাসগুলির একটি অন্তর্নির্মিত অভ্যন্তরীণ নাম থাকবে যা নিম্নলিখিত অংশগুলির তৈরি:

  • এটি _TtC দিয়ে শুরু হবে,
  • এমন একটি সংখ্যা অনুসরণ করবে যা আপনার অ্যাপ্লিকেশন নামের দৈর্ঘ্য,
  • আপনার অ্যাপ্লিকেশন নাম অনুসরণ করে,
  • এমন একটি সংখ্যা দ্বারা অনুভূত যা আপনার শ্রেণীর নামের দৈর্ঘ্য,
  • আপনার শ্রেণীর নাম অনুসরণ করে।

সুতরাং আপনার শ্রেণীর নামটি এমন কিছু হবে যা _TtC5MyApp7MyClass এর মতো

এক্সিকিউট করে আপনি স্ট্রিং হিসাবে এই নামটি পেতে পারেন:

var classString = NSStringFromClass(self.dynamicType)

সুইফ্ট 3-এ আপডেট করুন এটি এতে পরিবর্তিত হয়েছে:

var classString = NSStringFromClass(type(of: self))

সেই স্ট্রিংটি ব্যবহার করে, আপনি কার্যকর করে আপনার সুইফ্ট শ্রেণির একটি উদাহরণ তৈরি করতে পারেন:

var anyobjectype : AnyObject.Type = NSClassFromString(classString)
var nsobjectype : NSObject.Type = anyobjectype as NSObject.Type
var rec: AnyObject = nsobjectype()

এটি কেবল এনএসবজেক্ট ক্লাসের জন্যই কাজ করবে, সুইফ্ট ক্লাসগুলি কী। ডিফল্টরূপে তাদের কোনও থ্রো মেথোড নেই এবং প্রোটোকলের একটি টাইপকাস্ট কাজ করছে না বলে মনে হচ্ছে?
স্টিফান

এই নির্মাণের সাথে আমার ক্ষেত্রে সুইফ্ট 1.2 / এক্সকোড 6.3.1 ক্র্যাশ
স্টিফান

আমি এনএসকোডিং, প্রিন্টেবল, হ্যাশেবল, ইক্যুটেটেবল এবং জেএসওন গিথুব / ইভারমিয়ার / ইভি রিফ্লেকশন
এডউইন

উল্লিখিত সমস্যাটি সুইফট ২.০ এ স্থির করা হয়েছে ... আমার উত্তরটি দেখুন কারণ আপনাকে ডিআর কল করতে হবে .... কেবল এনসোবজেক্টটাইপ () আর সঠিক নয়।
স্টিফান

4
চলুন ক্লাসস্ট্রিং = এনএসএস স্ট্রিং ফ্রেমক্লাস (প্রকার (এর: স্ব))
অভিষেক থাপলিয়াল

11

এটা প্রায় একই

func NSClassFromString(_ aClassName: String!) -> AnyClass!

এই দস্তাবেজটি পরীক্ষা করুন:

https://developer.apple.com/library/prerelease/ios/docamentation/Cocoa/References/Foundation/Miscellaneous/Foundation_Function/#//apple_ref/c/func/NSClassFromString


4
এই ফাংশনটি কেবল NSClassক্লাস নিয়ে কাজ করে , সুইফ্ট ক্লাসগুলির সাথে নয়। NSClassFromString("String")ফিরে আসে nil, কিন্তু NSClassFromString("NSString")না।
সেজারি ওয়াজিক

আমি কম্পিউটারের সামনে নেই ... তবে আপনি চেষ্টা করে দেখতে পারেন: var myVar:NSClassFromString("myClassName")
গাবুহ

4
@ সিজারিওয়োজিক: পিএস Stringকোনও শ্রেণি নয়; এটি একটি কাঠামো
নিউএ্যাক্যাক্ট

4
@ নিউভ্যাক্ট ডি'ওহ, আপনি ঠিক বলেছেন, আমার খারাপ। তবে সমস্ত সুইফ্ট ক্লাসের পাশাপাশি যে কোনওভাবে NSClassFromStringরিটার্ন দেয় nil
সেজারি ওয়াজিক

যদি কোনও ক্লাসটি @objc এ টীকাযুক্ত হয় বা এনএসবজেক্ট থেকে উত্তরাধিকার সূত্রে আসে, তবে এটি অবজেক্টিভ-সি অবজেক্ট সিস্টেম ব্যবহার করে এবং এনএসক্লাসফ্রমস্ট্রিং, পদ্ধতি সুইজলিং ইত্যাদিতে অংশ নিয়েছে, তবে যদি তা না হয় তবে ক্লাসটি আপনার সুইফ্ট কোডের অভ্যন্তরীণ এবং না একই অবজেক্ট সিস্টেম ব্যবহার করবেন না। এটি সম্পূর্ণরূপে বর্ণিত হয়নি, তবে সুইফটের অবজেক্ট সিস্টেমটি অবজেক্টিভ-সি এর চেয়ে কম দেরিতে আবদ্ধ বলে মনে হচ্ছে।
বিল

9

আমি কোনও বস্তুকে গতিশীলভাবে ইনস্ট্যান্ট করতে সক্ষম হয়েছি

var clazz: NSObject.Type = TestObject.self
var instance : NSObject = clazz()

if let testObject = instance as? TestObject {
    println("yes!")
}

আমি AnyClassকোনও String(ওবজ-সি ব্যবহার না করে) তৈরির উপায় খুঁজে পাইনি । আমি মনে করি তারা আপনাকে এটি করতে চায় না কারণ এটি মূলত টাইপ সিস্টেমটি ভেঙে দেয়।


4
আমি মনে করি এই উত্তরটি এনএসক্লাসফ্র্যামস্ট্রিংয়ের বিষয়ে নয়, গতিশীল অবজেক্টের সূচনা করার জন্য একটি সুইফট-কেন্দ্রিক উপায় দেওয়ার জন্য এখানে সেরা। ভাগ করে নেওয়ার জন্য ধন্যবাদ!
ম্যাট লং

এই প্রতিক্রিয়াটি কেন শীর্ষে হওয়া উচিত তা তুলে ধরার জন্য @ সুলতান এবং ম্যাটকে ধন্যবাদ!
ইলিয়াস করিম

7

সুইফট 2-এর জন্য, আমি এটি আরও দ্রুত করার জন্য খুব সাধারণ এক্সটেনশন তৈরি করেছি https://github.com/damienromito/NSObject-FromClassName

extension NSObject {
    class func fromClassName(className : String) -> NSObject {
        let className = NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String + "." + className
        let aClass = NSClassFromString(className) as! UIViewController.Type
        return aClass.init()
    }
}

আমার ক্ষেত্রে, আমি যে ভিউ কন্ট্রোলার চাই তা লোড করার জন্য এটি করি:

override func viewDidLoad() {
    super.viewDidLoad()
    let controllers = ["SettingsViewController", "ProfileViewController", "PlayerViewController"]
    self.presentController(controllers.firstObject as! String)

}

func presentController(controllerName : String){
    let nav = UINavigationController(rootViewController: NSObject.fromClassName(controllerName) as! UIViewController )
    nav.navigationBar.translucent = false
    self.navigationController?.presentViewController(nav, animated: true, completion: nil)
}

6

এটি আপনাকে যে ক্লাসটি ইনস্ট্যান্ট করতে চাইবে তার নাম পাবে। তারপরে আপনি এডউইনস উত্তরটি ব্যবহার করতে পারেন আপনার শ্রেণীর কোনও নতুন অবজেক্ট ইনস্ট্যান্ট ।

বিটা 6 _stdlib_getTypeNameএর মত একটি ভেরিয়েবলের ম্যাংলেড টাইপের নাম পান। এটি খালি খেলার মাঠে আটকান:

import Foundation

class PureSwiftClass {
}

var myvar0 = NSString() // Objective-C class
var myvar1 = PureSwiftClass()
var myvar2 = 42
var myvar3 = "Hans"

println( "TypeName0 = \(_stdlib_getTypeName(myvar0))")
println( "TypeName1 = \(_stdlib_getTypeName(myvar1))")
println( "TypeName2 = \(_stdlib_getTypeName(myvar2))")
println( "TypeName3 = \(_stdlib_getTypeName(myvar3))")

আউটপুটটি হ'ল:

TypeName0 = NSString
TypeName1 = _TtC13__lldb_expr_014PureSwiftClass
TypeName2 = _TtSi
TypeName3 = _TtSS

ইভান সুইকের ব্লগ এন্ট্রি এই স্ট্রিংগুলি বোঝাতে সহায়তা করে: http://www.eswick.com/2014/06/inside-swift/

উদাহরণস্বরূপ _TtSiসুইফট এর অভ্যন্তরীণ Intপ্রকার বোঝায় ।


"তারপরে আপনি আপনার শ্রেণীর কোনও নতুন অবজেক্ট ইনস্ট্যান্ট করতে এডউইনস উত্তরটি ব্যবহার করতে পারেন" " আমি মনে করি না যে রেফ। PureSwiftClass জন্য উত্তর কাজ। উদাহরণস্বরূপ, ডিফল্টরূপে এই শ্রেণীর কোনও init পদ্ধতি নেই।
স্টিফান

6

সুইফট ২.০ এ (এক্সকোড .0.০১ এ পরীক্ষিত) _20150930

let vcName =  "HomeTableViewController"
let ns = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String

// Convert string to class
let anyobjecType: AnyObject.Type = NSClassFromString(ns + "." + vcName)!
if anyobjecType is UIViewController.Type {
// vc is instance
    let vc = (anyobjecType as! UIViewController.Type).init()
    print(vc)
}

5

এক্সকোড 7 বিটা 5:

class MyClass {
    required init() { print("Hi!") }
}
if let classObject = NSClassFromString("YOURAPPNAME.MyClass") as? MyClass.Type {
    let object = classObject.init()
}

3

ক্লাস থেকে স্ট্রিং

let classString = NSStringFromClass(TestViewController.self)

বা

let classString = NSStringFromClass(TestViewController.classForCoder())

স্ট্রিং থেকে একটি ইউআইভিউ কনট্রোলার ক্লাস শুরু করুন:

let vcClass = NSClassFromString(classString) as! UIViewController.Type
let viewController = vcClass.init()

3

আমি এই বিভাগটি সুইফট 3 এর জন্য ব্যবহার করছি:

//
//  String+AnyClass.swift
//  Adminer
//
//  Created by Ondrej Rafaj on 14/07/2017.
//  Copyright © 2017 manGoweb UK Ltd. All rights reserved.
//

import Foundation


extension String {

    func convertToClass<T>() -> T.Type? {
        return StringClassConverter<T>.convert(string: self)
    }

}

class StringClassConverter<T> {

    static func convert(string className: String) -> T.Type? {
        guard let nameSpace = Bundle.main.infoDictionary?["CFBundleExecutable"] as? String else {
            return nil
        }
        guard let aClass: T.Type = NSClassFromString("\(nameSpace).\(className)") as? T.Type else {
            return nil
        }
        return aClass

    }

}

ব্যবহারটি হবে:

func getViewController(fromString: String) -> UIViewController? {
    guard let viewController: UIViewController.Type = "MyViewController".converToClass() else {
        return nil
    }
    return viewController.init()
}

2

আমি মনে করি আমি ঠিক বলেছি যে আপনি পারবেন না, কমপক্ষে বর্তমান বিটা (2) এর সাথে নয়। আশা করি এটি এমন কিছু যা ভবিষ্যতের সংস্করণগুলিতে পরিবর্তিত হবে।

আপনি NSClassFromStringটাইপের একটি ভেরিয়েবল পেতে ব্যবহার করতে পারেন AnyClassতবে সুইফের এটি ইনস্ট্যান্ট করার কোনও উপায় নেই বলে মনে হয়। আপনি উদ্দেশ্য সি এর জন্য একটি সেতু ব্যবহার করতে পারেন এবং এটি সেখানে করতে পারেন - বা এটি আপনার ক্ষেত্রে কাজ করে - একটি স্যুইচ স্টেটমেন্ট ব্যবহার করে পিছিয়ে যান


এমনকি সুইফট ১.২ / এক্সকোড .3.৩.১ থাকা সত্ত্বেও এটি সম্ভব নয় বলে মনে হয়, বা আপনি কোনও সমাধান খুঁজে পেয়েছেন?
স্টিফান

2

স্পষ্টতই, ক্লাসের নামটি কেবল রানটাইমের সময় জানা গেলে সুইফটে কোনও বস্তু ইনস্ট্যান্ট করা (আর) সম্ভব নয়। এনএসবজেক্টের সাবক্লাসের জন্য একটি অবজেক্টিভ-সি র‍্যাপার সম্ভব।

কমপক্ষে আপনি একই শ্রেণীর কোনও অবজেক্টকে অবজেক্টি-সি মোড়ক ছাড়াই রানটাইমে প্রদত্ত অন্য কোনও অবজেক্টের মতো ইনস্ট্যান্ট করতে পারেন (xCode সংস্করণ 6.2 ​​- 6C107a ব্যবহার করে):

    class Test : NSObject {}
    var test1 = Test()
    var test2 = test1.dynamicType.alloc()

এটি শ্রেণীর নাম থেকে কোনও উদাহরণ তৈরি করে না।
স্টিফান

এটি আপনার উত্তর থেকে পরিষ্কার নয়, এটি খাঁটি সুইফ্ট ক্লাসে কাজ করছে না বলে মনে হচ্ছে, সঠিক?
স্টিফান

2

সুইফট ২.০ (এক্সকোড 7 এর বিটা ২ তে পরীক্ষিত) এ এটির মতো কাজ করে:

protocol Init {
  init()
}

var type = NSClassFromString(className) as? Init.Type
let obj = type!.init()

নিশ্চিতভাবে যে ধরণের আগমন ঘটে NSClassFromStringতা এই init প্রোটোকলটি প্রয়োগ করতে হবে।

আমি আশা করি এটি পরিষ্কার হয়ে গেছে, className ক্লাসের ওবজ-সি রানটাইম নাম সম্বলিত একটি স্ট্রিং যা ডিফল্টরূপে কেবল "ফু" নয়, তবে এই আলোচনাটি আপনার প্রশ্নের প্রধান বিষয় নয় আইএমএইচও।

আপনার এই প্রোটোকলটি প্রয়োজন কারণ ডিফল্ট হোন সমস্ত সুইফ্ট ক্লাস কোনও initপদ্ধতি প্রয়োগ করে না ।


আপনার যদি সুইফ্ট ক্লাস থাকে তবে আমার অন্যান্য প্রশ্নগুলি দেখুন: স্ট্যাকওভারফ্লো
স্টিফান

2

দেখে মনে হচ্ছে সঠিক জ্বলনটি হ'ল ...

func newForName<T:NSObject>(p:String) -> T? {
   var result:T? = nil

   if let k:AnyClass = NSClassFromString(p) {
      result = (k as! T).dynamicType.init()
   }

   return result
}

... যেখানে "পি" "প্যাকেজড" - এর একটি স্বতন্ত্র সমস্যা for

তবে অ্যানিক্লাস থেকে টি তে সমালোচনামূলক castালাই বর্তমানে একটি সংকলক ক্র্যাশ ঘটায়, সুতরাং এর মধ্যে একজনকে অবশ্যই K এর আরম্ভকরণটি পৃথক বন্ধে আবদ্ধ করতে হবে, যা জরিমানা সংকলন করে।


2

আমি বিভিন্ন লক্ষ্যবস্তু ব্যবহার করি এবং এই ক্ষেত্রে সুইফ্ট ক্লাসটি পাওয়া যায় না। আপনার CFBundleExecutable এর সাথে CFBundleName প্রতিস্থাপন করা উচিত। আমি সতর্কতাগুলিও স্থির করেছিলাম:

- (Class)swiftClassFromString:(NSString *)className {
    NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleExecutable"];
    NSString *classStringName = [NSString stringWithFormat:@"_TtC%lu%@%lu%@", (unsigned long)appName.length, appName, (unsigned long)className.length, className];
    return NSClassFromString(classStringName);
}

2

সমাধান কি এর মতো সহজ নয়?

// Given the app/framework/module named 'MyApp'
let className = String(reflecting: MyClass.self)

// className = "MyApp.MyClass"

4
আসল প্রশ্নটি স্ট্রিং থেকে ক্লাস চাইছিল, ক্লাস থেকে স্ট্রিং নয়।
রায়ান

1

এছাড়াও সুইফট 2.0 (সম্ভবত আগে?) এ সরাসরি আপনার সাথে টাইপ অ্যাক্সেস করতে পারেন dynamicTypeসম্পত্তি

অর্থাত্

class User {
    required init() { // class must have an explicit required init()
    }
    var name: String = ""
}
let aUser = User()
aUser.name = "Tom"
print(aUser)
let bUser = aUser.dynamicType.init()
print(bUser)

আউটপুট

aUser: User = {
  name = "Tom"
}
bUser: User = {
  name = ""
}

আমার ব্যবহারের ক্ষেত্রে কাজ করে



1

আমি এভাবে বাস্তবায়ন করেছি,

if let ImplementationClass: NSObject.Type = NSClassFromString(className) as? NSObject.Type{
   ImplementationClass.init()
}

1

সুইফট 5 , ব্যবহার করা সহজ, @ ওন্দ্রেজ রাফাজের জন্য ধন্যবাদ

  • সোর্স কোড:

    extension String {
         fileprivate
         func convertToClass<T>() -> T.Type? {
              return StringClassConverter<T>.convert(string: self)
         }
    
    
        var controller: UIViewController?{
              guard let viewController: UIViewController.Type = convertToClass() else {
                return nil
            }
            return viewController.init()
        }
    }
    
    class StringClassConverter<T> {
         fileprivate
         static func convert(string className: String) -> T.Type? {
             guard let nameSpace = Bundle.main.infoDictionary?["CFBundleExecutable"] as? String, let aClass = NSClassFromString("\(nameSpace).\(className)") as? T.Type else {
                 return nil
            }
             return aClass
    
       }
    
    }
    
  • এভাবে কল করুন:

    guard let ctrl = "ViewCtrl".controller else {
        return
    }
    //  ctrl do sth
    

0

একটি পৃষ্ঠার জাম্প উদাহরণ এখানে দেখানো হয়েছে, আশা আপনাকে সাহায্য করতে পারে!

let vc:UIViewController = (NSClassFromString("SwiftAutoCellHeight."+type) as! UIViewController.Type).init()
self.navigationController?.pushViewController(vc, animated: true)

// Click the Table response
tableView.deselectRow(at: indexPath, animated: true)
let sectionModel = models[(indexPath as NSIndexPath).section]
var className = sectionModel.rowsTargetControlerNames[(indexPath as NSIndexPath).row]
className = "GTMRefreshDemo.\(className)"
if let cls = NSClassFromString(className) as? UIViewController.Type {
   let dvc = cls.init()
   self.navigationController?.pushViewController(dvc, animated: true)
}

0

সুইফট 3 +

extension String {

    var `class`: AnyClass? {

        guard
            let dict = Bundle.main.infoDictionary,
            var appName = dict["CFBundleName"] as? String
            else { return nil }

        appName.replacingOccurrences(of: " ", with: "_")
        let className = appName + "." + self
        return NSClassFromString(className)
    }
}

এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান তা দেখিয়ে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
iBug

-6

এখানে একটি ভাল উদাহরণ:

class EPRocks { 
    @require init() { } 
}

class EPAwesome : EPRocks { 
    func awesome() -> String { return "Yes"; } 
}

var epawesome = EPAwesome.self(); 
print(epawesome.awesome);

4
এটি প্রশ্নটি যা জিজ্ঞাসা করছে তা করছে না।
থমাসডাব্লু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.