আমি কীভাবে সুইফটে কোনও ভেরিয়েবলের ধরণ বা শ্রেণি প্রিন্ট করব?


335

রান্টটাইম ধরণের কোনও পরিবর্তনকে প্রিন্টে ছাপানোর কোনও উপায় আছে কি? উদাহরণ স্বরূপ:

var now = NSDate()
var soon = now.dateByAddingTimeInterval(5.0)

println("\(now.dynamicType)") 
// Prints "(Metatype)"

println("\(now.dynamicType.description()")
// Prints "__NSDate" since objective-c Class objects have a "description" selector

println("\(soon.dynamicType.description()")
// Compile-time error since ImplicitlyUnwrappedOptional<NSDate> has no "description" method

উপরের উদাহরণে, আমি দেখানোর জন্য একটি উপায় সন্ধান করছি যে "শীঘ্রই" ভেরিয়েবলটি টাইপের ImplicitlyUnwrappedOptional<NSDate>, বা কমপক্ষে NSDate!


43
@ জেসনম্যাচার আমাকে বলুন যে আপনি যে প্রশ্নটি যুক্ত করেছেন তার যদি এই প্রশ্নটির 4 দিন পরে জিজ্ঞাসা করা হয় তবে এটি কী করে?
আকাশীবস্কি

একটি সুইফট অবজেক্টের ধরণের পরীক্ষা করা বা একটি সুইফ্ট অবজেক্টের ধরণটি পড়া সম্পর্কে অনেক প্রশ্ন রয়েছে। আমরা এই বিষয়টির জন্য "মাস্টার" প্রশ্ন হিসাবে সর্বাধিক সেরা প্রশ্নগুলি সন্ধান করছি। প্রস্তাবিত সদৃশটির আরও অনেক গভীর উত্তর রয়েছে। এটি এমনটি বলার অপেক্ষা রাখে না যে আপনি কিছু ভুল করেছেন, ঠিক এই যে আমরা বিশৃঙ্খলা হ্রাস করার চেষ্টা করছি।
জেসনমারচার

4
প্রস্তাবিত সদৃশ একই প্রশ্নের উত্তর দিচ্ছে না; টাইপ.সেল্ফটি ডিবাগিংয়ের উদ্দেশ্যে কনসোলে মুদ্রণ করা যায় না, এটি অন্য ফাংশনগুলিতে যেতে ব্যবহৃত হয় যা প্রকারকে অবজেক্ট হিসাবে গ্রহণ করে।
ম্যাট ব্রিজগুলি

2
ওটি: অত্যন্ত আশ্চর্যের বিষয় যে সুইফ্টটি বাক্সের বাইরে প্রস্তাব দেয় না এবং এই জাতীয় নিম্ন স্তরের সি লাইব্রেরিগুলির সাথে একটির চারপাশে ঘুরতে হবে। একটি বাগ রিপোর্ট মূল্যবান?
qwerty_so

বন্ধুরা, আমি নীচে আমার উত্তর সরবরাহ করেছি। দয়া করে একবার দেখুন এবং আমাকে যদি তা প্রত্যাশা করা হয় তবে তা জানান।
দিলিপ কোসুরি

উত্তর:


377

সেপ্টেম্বর 2016 আপডেট করুন

সুইফট ৩.০: ব্যবহার করুন type(of:), যেমন type(of: someThing)(যেহেতু মূলশব্দটি dynamicTypeসরানো হয়েছে)

অক্টোবর 2015 আপডেট করুন :

আমি নীচের উদাহরণগুলিকে নতুন সুইফট ২.০ সিনট্যাক্সে আপডেট করেছি (উদাহরণস্বরূপ printlnপ্রতিস্থাপন করা হয়েছিল print, toString()এখন String())।

এক্সকোড 6.3 রিলিজ নোটগুলি থেকে :

@ এনএসচাম মন্তব্যগুলিতে উল্লেখ করেছেন যে এক্সকোড .3.৩ রিলিজ নোটগুলি অন্যভাবে দেখায়:

প্রিন্টলান বা স্ট্রিং ইন্টারপোলেশন ব্যবহার করার সময় টাইপ মানগুলি পুরো ডিমেংলেড টাইপের নাম হিসাবে মুদ্রণ করে।

import Foundation

class PureSwiftClass { }

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

print( "String(myvar0.dynamicType) -> \(myvar0.dynamicType)")
print( "String(myvar1.dynamicType) -> \(myvar1.dynamicType)")
print( "String(myvar2.dynamicType) -> \(myvar2.dynamicType)")
print( "String(myvar3.dynamicType) -> \(myvar3.dynamicType)")

print( "String(Int.self)           -> \(Int.self)")
print( "String((Int?).self         -> \((Int?).self)")
print( "String(NSString.self)      -> \(NSString.self)")
print( "String(Array<String>.self) -> \(Array<String>.self)")

কোন ফলাফল:

String(myvar0.dynamicType) -> __NSCFConstantString
String(myvar1.dynamicType) -> PureSwiftClass
String(myvar2.dynamicType) -> Int
String(myvar3.dynamicType) -> String
String(Int.self)           -> Int
String((Int?).self         -> Optional<Int>
String(NSString.self)      -> NSString
String(Array<String>.self) -> Array<String>

এক্সকোড 6.3 এর জন্য আপডেট:

আপনি এটি ব্যবহার করতে পারেন _stdlib_getDemangledTypeName():

print( "TypeName0 = \(_stdlib_getDemangledTypeName(myvar0))")
print( "TypeName1 = \(_stdlib_getDemangledTypeName(myvar1))")
print( "TypeName2 = \(_stdlib_getDemangledTypeName(myvar2))")
print( "TypeName3 = \(_stdlib_getDemangledTypeName(myvar3))")

এবং এটি আউটপুট হিসাবে পান:

TypeName0 = NSString
TypeName1 = __lldb_expr_26.PureSwiftClass
TypeName2 = Swift.Int
TypeName3 = Swift.String

আসল উত্তর:

এক্সকোড 6.3 এর আগে _stdlib_getTypeNameএকটি ভেরিয়েবলের ম্যাংলেড টাইপের নাম পেল। ইভান সুইকের ব্লগ এন্ট্রি এই স্ট্রিংগুলি বোঝাতে সহায়তা করে:

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

মাইক অ্যাশের একই বিষয় জুড়ে একটি দুর্দান্ত ব্লগ এন্ট্রি রয়েছে


2
আপনি কিভাবে খুঁজে পেলেন _stdlib_getTypeName()? ইন্টিগ্রেটেড আরপিএল আর বিদ্যমান নেই, বিদ্যমান swift-ide-testনেই এবং এক্সকোডের সুইফ্ট মডিউল _এলিড-প্রিফিক্সড মানগুলির মুদ্রণ ।
লিলি

10
দেখে মনে হচ্ছে যে আমি lldbRepl এ সহজেই যথেষ্ট চিহ্ন সহ সন্ধান করতে পারি । এছাড়াও আছে _stdlib_getDemangledTypeName(), এবং _stdlib_demangleName()
লিলি ব্যালার্ড

1
ওহ ঝরঝরে, আমি বুঝতে পারি নি যে এর imageশর্টকাট ছিল target modules। আমি ব্যবহার করে শেষ করেছি target modules lookup -r -n _stdlib_, অবশ্যই কোনটি আরও ভালভাবে প্রকাশিত হয়েছেimage lookup -r -n _stdlib_ libswiftCore.dylib
লিলি ব্যালার্ড

1
এফওয়াইআই - দেখে মনে হচ্ছে স্ট্রিং (...) স্ট্রিংয়ের সাথে প্রতিস্থাপন করা হয়েছে (...)।
নিক

6
সুইফট 3.0: dynamicTypeকীওয়ার্ডটি সুইফ্ট থেকে সরানো হয়েছে। তার জায়গায় একটি নতুন আদিম ফাংশন type(of:): ভাষা যুক্ত করা হয়েছে github.com/apple/swift/blob/master/CHANGELOG.md
Szu

46

সম্পাদনা করুন: সুইফট ১.২ (এক্সকোড .3.৩) এ একটি নতুন toStringফাংশন চালু করা হয়েছে

আপনি এখন যেকোন প্রকারের ডিমেংলড প্রকার .selfএবং যে কোনও উদাহরণ ব্যবহার করে মুদ্রণ করতে পারেন .dynamicType:

struct Box<T> {}

toString("foo".dynamicType)            // Swift.String
toString([1, 23, 456].dynamicType)     // Swift.Array<Swift.Int>
toString((7 as NSNumber).dynamicType)  // __NSCFNumber

toString((Bool?).self)                 // Swift.Optional<Swift.Bool>
toString(Box<SinkOf<Character>>.self)  // __lldb_expr_1.Box<Swift.SinkOf<Swift.Character>>
toString(NSStream.self)                // NSStream

কল করার চেষ্টা করুন YourClass.selfএবং yourObject.dynamicType

তথ্যসূত্র: https://devforums.apple.com/thread/227425


2
আমি সেই থ্রেডে সাড়া দিয়েছি, তবে আমি এখানে আমার মন্তব্য যুক্ত করব। এই মানগুলি "মেটাটাইপ" ধরণের, তবে কোনও মেটাটাইপ অবজেক্টটি কী ধরণের প্রতিনিধিত্ব করে তা নির্ধারণের সহজ উপায় বলে মনে হয় না, যা আমি খুঁজছি।
ম্যাট ব্রিজ

এগুলি মেটাটাইপ টাইপের, এবং তারা ক্লাস হয়। তারা একটি শ্রেণীর প্রতিনিধিত্ব করে। আপনার সমস্যাটি ঠিক কী তা নিয়ে নিশ্চিত নয়। someInstance.dynamicType.printClassName()ক্লাসের নাম মুদ্রণ করবে।
অ্যানালগ ফাইল

18
প্রিন্টক্লাসনাম () পদ্ধতিটি হ'ল দস্তাবেজের একটি নমুনায় একটি উদাহরণ পদ্ধতি তৈরি করে, এটি আপনি যে অ্যাক্সেস করতে পারেন এমন কোনও এপিআই কল নয়।
ডেভ উড

4
এফওয়াইআই - দেখে মনে হচ্ছে টু স্ট্রিং (...) স্ট্রিং (...) এর সাথে প্রতিস্থাপন করা হয়েছে
নিক

33

সুইফট 3.0

let string = "Hello"
let stringArray = ["one", "two"]
let dictionary = ["key": 2]

print(type(of: string)) // "String"

// Get type name as a string
String(describing: type(of: string)) // "String"
String(describing: type(of: stringArray)) // "Array<String>"
String(describing: type(of: dictionary)) // "Dictionary<String, Int>"

// Get full type as a string
String(reflecting: type(of: string)) // "Swift.String"
String(reflecting: type(of: stringArray)) // "Swift.Array<Swift.String>"
String(reflecting: type(of: dictionary)) // "Swift.Dictionary<Swift.String, Swift.Int>"

1
সুইফট 2 বাস্তবায়ন এনামের ক্ষেত্রে খুব ভাল। এই আচরণটি অ্যাপল দ্বারা নথিভুক্ত / গ্যারান্টিযুক্ত কিনা তা কি কেউ জানেন? স্ট্যান্ডার্ড লাইব্রেরিতে কেবল একটি মন্তব্য রয়েছে যা এটি ডিবাগিংয়ের জন্য উপযুক্ত ...
মিলস

30

এটি কি আপনি খুঁজছেন?

println("\(object_getClassName(now))");

এটি "__NS তারিখ" মুদ্রণ করে

আপডেট : দয়া করে নোট করুন এটি আর বিটা 5 হিসাবে কাজ করবে বলে মনে হচ্ছে না


2
সুইফ্ট ক্লাসের জন্য কাজ করে না। "অনিরাপদ পয়েন্টার (0x7FBB18D06DE0)" ফেরত পাঠায়
অ্যারেক্সট

4
ওবিজেসি ক্লাসের জন্যও কাজ করে না (কমপক্ষে বিটা 5 এ), এনএস ম্যানেজডঅবজেক্টের জন্য আমি কেবল "বিল্টিন.রোউপয়েন্টার = ঠিকানা"
পাই

23

আমার বর্তমান এক্সকোডটি সংস্করণ 6.0 (6A280e)।

import Foundation

class Person { var name: String; init(name: String) { self.name = name }}
class Patient: Person {}
class Doctor: Person {}

var variables:[Any] = [
    5,
    7.5,
    true,
    "maple",
    Person(name:"Sarah"),
    Patient(name:"Pat"),
    Doctor(name:"Sandy")
]

for variable in variables {
    let typeLongName = _stdlib_getDemangledTypeName(variable)
    let tokens = split(typeLongName, { $0 == "." })
    if let typeName = tokens.last {
        println("Variable \(variable) is of Type \(typeName).")
    }
}

আউটপুট:

Variable 5 is of Type Int.
Variable 7.5 is of Type Double.
Variable true is of Type Bool.
Variable maple is of Type String.
Variable Swift001.Person is of Type Person.
Variable Swift001.Patient is of Type Patient.
Variable Swift001.Doctor is of Type Doctor.

1
ভাল, তবে প্রশ্নটিতে বিকল্পগুলিও অন্তর্ভুক্ত রয়েছে, বিকল্পগুলির আউটপুট সেট করা আছে Optional(...), সুতরাং আপনার কোডটি কেবল Optionalটাইপ হিসাবে ফিরে আসবে । এটি var optionalTestVar: Person? = Person(name:"Sarah")ptionচ্ছিক (ব্যক্তি) হিসাবে দেখানো উচিত এবং ব্যক্তির সাথে বৈচিত্র্যময় হতে পারে!
ইম্পিলিকেউলিপডপশনাল

18

এক্সকোড 6.3 হিসাবে স্যুইফ্ট 1.2 এর সাথে, আপনি কেবল টাইপ মানগুলি সম্পূর্ণ ডিমেংলেডে রূপান্তর করতে পারেন String

toString(Int)                   // "Swift.Int"
toString(Int.Type)              // "Swift.Int.Type"
toString((10).dynamicType)      // "Swift.Int"
println(Bool.self)              // "Swift.Bool"
println([UTF8].self)            // "Swift.Array<Swift.UTF8>"
println((Int, String).self)     // "(Swift.Int, Swift.String)"
println((String?()).dynamicType)// "Swift.Optional<Swift.String>"
println(NSDate)                 // "NSDate"
println(NSDate.Type)            // "NSDate.Type"
println(WKWebView)              // "WKWebView"
toString(MyClass)               // "[Module Name].MyClass"
toString(MyClass().dynamicType) // "[Module Name].MyClass"

অন্য দিকটি কি 1.2 সালে সম্ভব? শ্রেণীর নামের উপর ভিত্তি করে কোনও উদাহরণ শুরু করতে?
ব্যবহারকারী 965972

@ ব্যবহারকারী965972 যতদূর আমি জানি আমি মনে করি যে এর কোনও আছে।
14:53

17

আপনি এখনও ক্লাস অ্যাক্সেস করতে পারেন className(এর মাধ্যমে যা প্রত্যাবর্তন করে String)।

বাস্তবে এমন কোনো শ্রেণী পেতে বিভিন্নভাবে, উদাহরণস্বরূপ হয় classForArchiver, classForCoder, classForKeyedArchiver(সমস্ত রিটার্ন AnyClass!)।

আপনি একটি আদিম প্রকৃতি (একটি আদিম হয় না পেতে পারেন না একটি বর্গ)।

উদাহরণ:

var ivar = [:]
ivar.className // __NSDictionaryI

var i = 1
i.className // error: 'Int' does not have a member named 'className'

আপনি যদি কোনও আদিম ধরনের পেতে চান তবে আপনাকে ব্যবহার করতে হবে bridgeToObjectiveC()। উদাহরণ:

var i = 1
i.bridgeToObjectiveC().className // __NSCFNumber

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

এই উদাহরণগুলি খেলার মাঠে কাজ করছে বলে মনে হয় না। আমি একইভাবে আদিম এবং অ-আদিমদের জন্য ত্রুটি পেয়েছি।
ম্যাট ব্রিজ

চেষ্টা কর import Cocoa
Leandros

9
ওএসএক্সের জন্য বিকাশকালে ক্লাসনামটি কেবল এনএসওবজেক্টগুলির জন্য উপলব্ধ বলে মনে হয়; এটি এনএসওবজেক্টস বা "সাধারণ" অবজেক্টগুলির জন্য আইওএস এসডিকে উপলভ্য নয়
ম্যাট ব্রিজ

3
classNameকোকো-এর অ্যাপলস্ক্রিপ্ট সমর্থনের অংশ এবং অবশ্যই জেনেরিক অন্তর্নির্মাণের জন্য ব্যবহার করা উচিত নয়। স্পষ্টতই এটি আইওএস এ উপলব্ধ নয়।
নিকোলাই রুহে

16

আপনি অবজেক্ট সম্পর্কে তথ্য পেতে প্রতিবিম্ব ব্যবহার করতে পারেন।
উদাহরণস্বরূপ বস্তুর শ্রেণীর নাম:

var শ্রেণীর নাম = প্রতিবিম্বিত (এখন) .সূত্র

বিটা 6 এ, এটি আমার কাছে অ্যাপ্লিকেশনটির নামটি + ক্লাসের নামটি সামান্য ম্যাংলেড আকারে পেয়েছে তবে এটি শুরু। +1 এর জন্য reflect(x).summary- ধন্যবাদ!
অলি

কাজ করেনি, সুইফট ১.২
এক্সকোড .4.৪

13

আমার সাথে ভাগ্য ছিল:

let className = NSStringFromClass(obj.dynamicType)

@ hdost dude কিছুই করেনি ক্লাসফোর কোডার কাজ করেছে।
সত্যেশ্বরন


10

এক্সকোড 8 এ, সুইফট 3.0

পদক্ষেপ:

1. প্রকারটি পান:

বিকল্প 1:

let type : Type = MyClass.self  //Determines Type from Class

বিকল্প 2:

let type : Type = type(of:self) //Determines Type from self

স্ট্রিং এ রূপান্তর করুন:

let string : String = "\(type)" //String

8

সুইফট 3.0-এর ক্ষেত্রে আপনি ব্যবহার করতে পারেন type(of:), যেমন dynamicTypeশব্দ সরিয়ে দেওয়া হয়েছে।


7

সুইফট 5

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

এখানে আমার সম্পূর্ণ উত্তর: সুইফটে স্ট্রিং হিসাবে বস্তুর শ্রেণীর নাম পান

এই প্রশ্নটি স্ট্রিং হিসাবে কোনও বস্তুর শ্রেণীর নাম পাওয়ার জন্য একটি উপায় খুঁজছে তবে, আমি একটি ভেরিয়েবলের ক্লাসের নাম পাওয়ার আরও একটি উপায় প্রস্তাব করেছি যা সাবক্লাস নয় NSObject। এটা এখানে:

class Utility{
    class func classNameAsString(obj: Any) -> String {
        //prints more readable results for dictionaries, arrays, Int, etc
        return String(describing: type(of: obj))
    }
}

আমি একটি স্ট্যাটিক ফাংশন করেছি যা প্যারামিটার হিসাবে টাইপের একটি অবজেক্ট হিসাবে লাগে Anyএবং এর শ্রেণীর নাম হিসাবে String:) প্রদান করে।

আমি কিছু ভেরিয়েবলের সাথে এই ফাংশনটি পরীক্ষা করেছি:

    let diccionary: [String: CGFloat] = [:]
    let array: [Int] = []
    let numInt = 9
    let numFloat: CGFloat = 3.0
    let numDouble: Double = 1.0
    let classOne = ClassOne()
    let classTwo: ClassTwo? = ClassTwo()
    let now = NSDate()
    let lbl = UILabel()

এবং আউটপুটটি ছিল:

  • ডিকসিওনারারি হ'ল ডিকশনারী
  • অ্যারে টাইপ অ্যারে হয়
  • numInt প্রকারের অন্তর্গত হয়
  • numFloat টাইপ CGFloat হয়
  • numDouble ডাবল টাইপের হয়
  • ClassOne ধরণের: ClassOne
  • ক্লাসটো দুই ধরণের: ClassTwo
  • এখন টাইপ টাইপ: তারিখ
  • lbl প্রকারের: UILabel

5

কোকো ব্যবহার করার সময় (কোকোপাচ নয়) আপনি classNameএনএসওজেক্টের সাবক্লাসযুক্ত বস্তুর জন্য সম্পত্তিটি ব্যবহার করতে পারেন ।

println(now.className)

এই সম্পত্তিটি সাধারণ সুইফ্ট অবজেক্টের জন্য উপলভ্য নয়, যা এনএসবজেক্টের সাবক্লাস নয় (এবং বাস্তবে সুইফটে কোনও মূল আইডি বা অবজেক্টের ধরণ নেই)।

class Person {
    var name: String?
}

var p = Person()
println(person.className) // <- Compiler error

কোকো টুচে, এই সময়ে প্রদত্ত ভেরিয়েবলের ধরণের স্ট্রিং বর্ণনা পাওয়ার উপায় নেই। কোকো বা কোকো টাচ উভয় ক্ষেত্রেই আদিম ধরণের জন্য অনুরূপ কার্যকারিতা বিদ্যমান নেই।

সুইফট আরএপিএল এর ধরণ সহ মানগুলির একটি সংক্ষিপ্তসার মুদ্রণ করতে সক্ষম হয়, সুতরাং ভবিষ্যতে কোনও এপিআইয়ের মাধ্যমে এই আত্মপরিবর্তনটি সম্ভব হবে।

সম্পাদনা : dump(object)কৌশলটি মনে হচ্ছে।


এমনকি এক্সকোড 10 এবং সুইফট 4.2 হিসাবেও dump(object)সত্যই শক্তিশালী। ধন্যবাদ.
অ্যালেক্স জাভাটোন

5

উপরের উত্তরের সাথে এটি ব্যবহারের নতুন পদ্ধতিটির কার্যকারী উদাহরণ নেই type(of:। সুতরাং আমার মতো ছদ্মবেশীদের সহায়তা করার জন্য, এখানে একটি কার্যকরী উদাহরণ রয়েছে যা বেশিরভাগই অ্যাপলের ডক্স থেকে নেওয়া হয়েছে - https://developer.apple.com/docamentation/swift/2885064-type

doubleNum = 30.1

func printInfo(_ value: Any) {
    let varType = type(of: value)
    print("'\(value)' of type '\(varType)'")
}

printInfo(doubleNum)
//'30.1' of type 'Double'

4

আমি এখানে অন্যান্য কয়েকটি উত্তর চেষ্টা করেছি তবে মাইলেজ মনে হয় অন্তর্নিহিত বস্তুটি কী very

তবে আমি একটি উপায় খুঁজে পেয়েছি যাতে আপনি নিম্নলিখিত জিনিসগুলি করে কোনও বস্তুর জন্য অবজেক্ট-সি শ্রেণীর নাম পেতে পারেন:

now?.superclass as AnyObject! //replace now with the object you are trying to get the class name for

আপনি এটি কীভাবে ব্যবহার করবেন তার উদাহরণ এখানে এবং:

let now = NSDate()
println("what is this = \(now?.superclass as AnyObject!)")

এই ক্ষেত্রে এটি কনসোলে এনএসডিট প্রিন্ট করবে।


4

আমি এই সমাধানটি পেয়েছি যা আশা করি অন্য কারও পক্ষে কাজ করতে পারে। মানটি অ্যাক্সেস করার জন্য আমি একটি শ্রেণি পদ্ধতি তৈরি করেছি। দয়া করে মনে রাখবেন এটি কেবল এনএসবজেক্ট সাবক্লাসের জন্য কাজ করবে। তবে কমপক্ষে একটি পরিষ্কার এবং পরিচ্ছন্ন সমাধান।

class var className: String!{
    let classString : String = NSStringFromClass(self.classForCoder())
    return classString.componentsSeparatedByString(".").last;
}

4

সুইফট ১.২ সহ সর্বশেষতম এক্সকোড .3.৩ এ, এটিই আমি খুঁজে পেলাম:

if view.classForCoder.description() == "UISegment" {
    ...
}

দ্রষ্টব্য: বিবরণ () বিন্যাসে শ্রেণীর নামটি দেয় <swift module name>.<actual class name>, সুতরাং আপনি স্ট্রিংটি একটি দিয়ে বিভক্ত করতে .এবং শেষ টোকেনটি পেতে চান।
ম্যাথু কুইরোস

4

এখানে অনেক উত্তর সর্বশেষতম সুইফ্ট (লেখার সময় Xcode 7.1.1) দিয়ে কাজ করে না।

তথ্য পাওয়ার বর্তমান উপায় হ'ল এটি তৈরি করা Mirrorএবং জিজ্ঞাসাবাদ করা। শ্রেণিকামের জন্য এটি এতটা সহজ:

let mirror = Mirror(reflecting: instanceToInspect)
let classname:String = mirror.description

অবজেক্ট সম্পর্কে অতিরিক্ত তথ্য এছাড়াও থেকে প্রাপ্ত করা যেতে পারে Mirror। বিস্তারিত জানার জন্য http://swiftdoc.org/v2.1/type/Mirror/ দেখুন ।


উত্তরগুলি কী স্ট্যাকওভারফ্লো . com/ a / 25345480/ 1187415 এবং স্ট্যাকওভারফ্লো . com / a/ 32087449 / 1187415 ? উভয়ই সুইফট ২-এর সাথে বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে (অন্যটি পরীক্ষা করে
মার্টিন আর

আমি এটিকে একটি সাধারণ সমাধান হিসাবে পছন্দ করি, তবে "ভিউকন্ট্রোলারের জন্য মিরর" (বহিরাগত "মিরর জন্য") পেয়ে - অপেক্ষা করুন, দেখে মনে হচ্ছে এটি ".সুবজেক্টটাইপ" ব্যবহার করে কৌতুক করে!
ডেভিড এইচ

3

বিটা 5 হিসাবে এলএলডিবিতে আপনি কমান্ডটি সহ কোনও বস্তুর শ্রেণি দেখতে পাবেন:

fr v -d r shipDate

যা এরকম কিছু তৈরি করে:

(DBSalesOrderShipDate_DBSalesOrderShipDate_ *) shipDate = 0x7f859940

কমান্ডটি প্রসারিত হওয়ার অর্থ এরকম কিছু:

Frame Variable (একটি ফ্রেম ভেরিয়েবল মুদ্রণ) -d run_target (গতিশীল প্রকার প্রসারিত)

জেনে রাখা কার্যকর কিছু হ'ল আউটপুট ভেরিয়েবলের মানগুলিতে "ফ্রেম ভেরিয়েবল" ব্যবহার করা কোনও গণ্ডিকে গ্যারান্টি দেয়।


3

আমি স্ব-বিকাশযুক্ত ক্লাসগুলির জন্য একটি সমাধান পেয়েছি (বা যেমন আপনার অ্যাক্সেস রয়েছে)।

আপনার বস্তু শ্রেণীর সংজ্ঞা মধ্যে নিম্নলিখিত গণ্য সম্পত্তি রাখুন :

var className: String? {
    return __FILE__.lastPathComponent.stringByDeletingPathExtension
}

এখন আপনি কেবল নিজের অবজেক্টে ক্লাসের নামটি কল করতে পারেন:

myObject.className

দয়া করে মনে রাখবেন এই হবে শুধুমাত্র যদি কাজ আপনার বর্গ সংজ্ঞা যে নামকরণ করা হয় একটি ফাইল মধ্যে তৈরি করা হয় ঠিক বর্গ আপনি নাম চান না।

যেহেতু সাধারণত এটি হয় তবে উপরের উত্তরটি বেশিরভাগ ক্ষেত্রেই করা উচিত । তবে কিছু বিশেষ ক্ষেত্রে আপনার আলাদা সমাধান বের করার প্রয়োজন হতে পারে।


আপনার নিজের শ্রেণীর (ফাইল) এর মধ্যে বর্গের নাম প্রয়োজন হলে আপনি কেবল এই লাইনটি ব্যবহার করতে পারেন:

let className = __FILE__.lastPathComponent.stringByDeletingPathExtension

হয়তো এই পদ্ধতিটি কিছু লোককে সেখানে সাহায্য করে।


3

উপরের ক্লাস এবং কেভিন বলার্ডের দেওয়া উত্তর এবং মন্তব্যের ভিত্তিতে আমি সাথে যাব:

println(_stdlib_getDemangledTypeName(now).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(soon).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(soon?).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(soon!).componentsSeparatedByString(".").last!)

println(_stdlib_getDemangledTypeName(myvar0).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(myvar1).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(myvar2).componentsSeparatedByString(".").last!)
println(_stdlib_getDemangledTypeName(myvar3).componentsSeparatedByString(".").last!)

যা মুদ্রণ করবে:

"NSDate"
"ImplicitlyUnwrappedOptional"
"Optional"
"NSDate"

"NSString"
"PureSwiftClass"
"Int"
"Double"

আমি মনে করি এটি আরও ভাল উত্তর।
মাসআল

আমি নিম্নলিখিতটি সুইফট ১.২ এ ব্যবহার করে শেষ করেছি: toString(self.dynamicType).componentsSeparatedByString(".").last!স্পষ্টতই আমি একটি অবজেক্ট প্রসঙ্গে ছিলাম এবং রেফারেন্স করতে সক্ষম হয়েছি self
জো

3
let i: Int = 20


  func getTypeName(v: Any) -> String {
    let fullName = _stdlib_demangleName(_stdlib_getTypeName(i))
    if let range = fullName.rangeOfString(".") {
        return fullName.substringFromIndex(range.endIndex)
    }
    return fullName
}

println("Var type is \(getTypeName(i)) = \(i)")

3

সুইফট সংস্করণ 4:

print("\(type(of: self)) ,\(#function)")
// within a function of a class

ধন্যবাদ @ জোশুয়া ডান্স


3

সুইফট 4:

// "TypeName"
func stringType(of some: Any) -> String {
    let string = (some is Any.Type) ? String(describing: some) : String(describing: type(of: some))
    return string
}

// "ModuleName.TypeName"
func fullStringType(of some: Any) -> String {
    let string = (some is Any.Type) ? String(reflecting: some) : String(reflecting: type(of: some))
    return string
}

ব্যবহার:

print(stringType(of: SomeClass()))     // "SomeClass"
print(stringType(of: SomeClass.self))  // "SomeClass"
print(stringType(of: String()))        // "String"
print(fullStringType(of: String()))    // "Swift.String"

2

একটি স্বেচ্ছাসেবী মানের ধরণের নাম প্রিন্ট করার কোনও সাধারণ উপায় নেই বলে মনে হয়। অন্যরা যেমন উল্লেখ করেছে, শ্রেণীর উদাহরণগুলির জন্য আপনি মুদ্রণ করতে পারেনvalue.className তবে আদিম মানের জন্য এটি প্রদর্শিত হয় যে রানটাইমের সময় টাইপ তথ্য চলে গেছে।

উদাহরণস্বরূপ, দেখে মনে হচ্ছে টাইপ করার কোনও উপায় নেই: 1.something()এবং এর Intকোনও মান খুঁজে বের করুন something। (আপনি, যেমন অন্য উত্তর প্রস্তাব ব্যবহার করতে পারেন i.bridgeToObjectiveC().classNameআপনি একটি ইঙ্গিতটি দিতে, কিন্তু __NSCFNumberহয় না আসলে ধরণ i-। ঠিক কি এটা যখন এটি একটি উদ্দেশ্য-সি ফাংশন কল সীমানা অতিক্রম করে রূপান্তরিত হবে)

আমি ভুল প্রমাণিত হতে পেরে খুশি হব, তবে দেখে মনে হচ্ছে টাইপ চেকিং সমস্তই সংকলন সময়ে সম্পন্ন হয়েছে এবং সি ++ এর মতো (আরটিটিআই অক্ষম সহ) টাইপ তথ্যগুলির বেশিরভাগ রানটাইমে চলে গেছে।


Xcode6 এর খেলার মাঠে কাজ করে এমন আমার উদাহরণে "এখন" ভেরিয়েবলের জন্য "NSDate" মুদ্রণের জন্য ক্লাসনেম ব্যবহারের উদাহরণ দিতে পারেন? আমি যতদূর বলতে পারি, ClassName সুইফট অবজেক্টগুলিতে, এমনকি এনএসবজেক্টের সাবক্লাসগুলিতেও সংজ্ঞায়িত হয় না।
ম্যাট ব্রিজ

এটি এনএসওবজেক্ট থেকে নেমে আসা অবজেক্টগুলির জন্য 'শ্রেণীর নাম' উপলভ্য বলে মনে হয় তবে কেবল ম্যাকের জন্য বিকাশ করার সময়, আইওএসের জন্য নয়। আইওএসের জন্য মোটেই কোনও কার্যকারিতা নেই বলে মনে হয়।
ম্যাট ব্রিজ

1
হ্যাঁ, আসল গ্রহণের বিষয়টি এখানে উপস্থিত হতে দেখা যায়, সাধারণ ক্ষেত্রে, টাইপ তথ্য দ্রুতগতিতে রানটাইমের সময় চলে যায়।
ipmcc

আমি কৌতূহল করছি কীভাবে REPL কীভাবে মানগুলির প্রকারগুলি মুদ্রণ করতে সক্ষম।
ম্যাট ব্রিজগুলি

আরপিএল প্রায় অবশ্যই ব্যাখ্যা করা এবং সংকলিত নয়, যা সহজেই এটি ব্যাখ্যা করতে পারে
ipmcc

2

এভাবেই আপনি নিজের অবজেক্টের টাইপ স্ট্রিং বা টাইপ পাবেন যা সামঞ্জস্যপূর্ণ এবং কোন মডিউলে অবজেক্টের সংজ্ঞাটি অন্তর্ভুক্ত বা নেস্টেড তা বিবেচনায় নেয় Sw সুইফট ৪.x. এ কাজ করে Works

@inline(__always) func typeString(for _type: Any.Type) -> String {
    return String(reflecting: type(of: _type))
}

@inline(__always) func typeString(for object: Any) -> String {
    return String(reflecting: type(of: type(of: object)))
}

struct Lol {
    struct Kek {}
}

// if you run this in playground the results will be something like
typeString(for: Lol.self)    //    __lldb_expr_74.Lol.Type
typeString(for: Lol())       //    __lldb_expr_74.Lol.Type
typeString(for: Lol.Kek.self)//    __lldb_expr_74.Lol.Kek.Type
typeString(for: Lol.Kek())   //    __lldb_expr_74.Lol.Kek.Type

2

একটি পেতে বস্তুর ধরণ বা বস্তুর বর্গ মধ্যে সুইফট , আপনি একটি ব্যবহার করতে হবে আবশ্যক প্রকার (সংখ্যা: yourObject)

প্রকার (এর: আপনার অবজেক্ট)


1

আপনি ঠিক তার পরে যা করছেন তা নয়, আপনি সুইফট প্রকারের মতো চলকের ধরণটিও পরীক্ষা করতে পারেন:

let object: AnyObject = 1

if object is Int {
}
else if object is String {
}

উদাহরণ স্বরূপ.


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