क्या स्विफ्ट सपोर्ट रिफ्लेक्ट करता है? जैसे वहाँ valueForKeyPath:
और setValue:forKeyPath:
स्विफ्ट वस्तुओं के लिए कुछ है ?
वास्तव में यह भी एक गतिशील प्रकार प्रणाली है, obj.class
उद्देश्य सी में कुछ की तरह ?
क्या स्विफ्ट सपोर्ट रिफ्लेक्ट करता है? जैसे वहाँ valueForKeyPath:
और setValue:forKeyPath:
स्विफ्ट वस्तुओं के लिए कुछ है ?
वास्तव में यह भी एक गतिशील प्रकार प्रणाली है, obj.class
उद्देश्य सी में कुछ की तरह ?
जवाबों:
ऐसा लगता है कि कुछ प्रतिबिंब समर्थन की शुरुआत है:
class Fruit {
var name="Apple"
}
reflect(Fruit()).count // 1
reflect(Fruit())[0].0 // "name"
reflect(Fruit())[0].1.summary // "Apple"
Mchambers gist से, यहाँ: https://gist.github.com/mchambers/fb9da554898dae3e54f2
Mirror
वास्तव में शब्द को IDE
कई बार उद्धृत करता है ।
_stdlib_getTypeName
।
यदि एक वर्ग का विस्तार होता है NSObject
, तो सभी उद्देश्य-सी के आत्मनिरीक्षण और गतिशीलता का काम करते हैं। यह भी शामिल है:
इस कार्यक्षमता की एक कमी स्विफ्ट वैकल्पिक मूल्य प्रकारों के लिए समर्थन है। उदाहरण के लिए Int गुण एनुमरेट और संशोधित किए जा सकते हैं लेकिन Int? गुण नहीं कर सकते। वैकल्पिक प्रकार को प्रतिबिंबित / मिरर टाइप का उपयोग करके आंशिक रूप से गणना की जा सकती है, लेकिन फिर भी संशोधित नहीं किया गया है।
यदि कोई वर्ग विस्तार नहीं करता है NSObject
, तो केवल नया, बहुत सीमित (और प्रगति में है) प्रतिबिंब कार्य करता है (प्रतिबिंबित / मिरर टाइप देखें), जो अपनी कक्षा और गुणों के बारे में एक उदाहरण पूछने की सीमित क्षमता को जोड़ता है, लेकिन उपरोक्त अतिरिक्त विशेषताओं में से कोई भी नहीं। ।
जब NSObject का विस्तार नहीं किया जाता है, या '@objc' निर्देश का उपयोग करते हुए, स्विफ्ट डिफॉल्ट को स्थैतिक- और व्यवहार्य-आधारित प्रेषण में बदल देता है। यह तेज़ है, हालाँकि, वर्चुअल मशीन की अनुपस्थिति में रनटाइम विधि अवरोधन की अनुमति नहीं है। यह अवरोधन कोको का एक मूलभूत हिस्सा है और निम्न प्रकार की विशेषताओं के लिए आवश्यक है:
इसलिए इसकी सिफारिश की गई है कि स्विफ्ट के साथ लागू कोको / कोकोआटौक्स अनुप्रयोगों में क्लैस:
सारांश:
संदर्भ डेटा: विधि चालान के लिए निष्पादन ओवरहेड:
(वास्तविक प्रदर्शन हार्डवेयर पर निर्भर करता है, लेकिन अनुपात समान रहेगा)।
इसके अलावा, गतिशील विशेषता हमें स्विफ्ट को स्पष्ट रूप से निर्देश देने की अनुमति देती है कि एक विधि को गतिशील प्रेषण का उपयोग करना चाहिए, और इसलिए अवरोधन का समर्थन करेगा।
public dynamic func foobar() -> AnyObject {
}
प्रलेखन मुख्य रूप से के बारे में एक गतिशील प्रकार प्रणाली के बारे में बोलता है
Type
तथा dynamicType
देख मेटाटाइप प्रकार (भाषा संदर्भ में)
उदाहरण:
var clazz = TestObject.self
var instance: TestObject = clazz()
var type = instance.dynamicType
println("Type: \(type)") //Unfortunately this prints only "Type: Metatype"
अब मान लिया गया TestObject
हैNSObject
var clazz: NSObject.Type = TestObject.self
var instance : NSObject = clazz()
if let testObject = instance as? TestObject {
println("yes!") //prints "yes!"
}
वर्तमान में, कोई प्रतिबिंब लागू नहीं है।
संपादित करें: मैं जाहिरा तौर पर गलत था, स्टीववे का जवाब देखें। में निर्मित गुणों के लिए कुछ सरल पढ़ने योग्य प्रतिबिंब है, शायद आईडीई को ऑब्जेक्ट सामग्री का निरीक्षण करने की अनुमति देता है।
ऐसा लगता है कि एक स्विफ्ट प्रतिबिंब एपीआई इस समय एप्पल के लिए एक उच्च प्राथमिकता नहीं है। लेकिन @stevex जवाब के अलावा मानक पुस्तकालय में एक और कार्य है जो मदद करता है।
बीटा 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
इवान स्विक की ब्लॉग प्रविष्टि इन तारों को समझने में मदद करती है:
उदाहरण _TtSi
के लिए स्विफ्ट का आंतरिक Int
प्रकार है।
माइक ऐश के पास एक ही विषय को कवर करने वाली एक महान ब्लॉग प्रविष्टि है ।
आप इसके बजाय toString () का उपयोग करने पर विचार करना चाह सकते हैं । यह सार्वजनिक है और के रूप में सिर्फ एक ही काम करता है () _stdlib_getTypeName अंतर यह है कि यह भी पर काम करता है के साथ AnyClass एक खेल का मैदान में, उदाहरण के लिए प्रवेश
class MyClass {}
toString(MyClass.self) // evaluates to "__lldb_expr_49.MyClass"
reflect
स्विफ्ट 5 में कोई कीवर्ड नहीं , अब आप उपयोग कर सकते हैं
struct Person {
var name="name"
var age = 15
}
var me = Person()
var mirror = Mirror(reflecting: me)
for case let (label?, value) in mirror.children {
print (label, value)
}
json
deserialization के लिए लागू करने जा रहा हूं