সুইফট প্রতিবিম্ব সমর্থন করে? যেমন মত সেখানে কিছু 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"
মাচেম্বার্সের টুকরো থেকে, এখানে: https://gist.github.com/mchaumber/fb9da554898dae3e54f2
Mirrorআসলে IDEকয়েকবার শব্দটি উদ্ধৃত করে ।
_stdlib_getTypeName
যদি কোনও শ্রেণি প্রসারিত হয় NSObject, তবে অবজেক্টিভ-সি এর সমস্ত আত্মপরিচয় এবং গতিশীলতা কাজ করে। এটা অন্তর্ভুক্ত:
এই কার্যকারিতার একটি ঘাটতি হ'ল সুইফ্ট alচ্ছিক মান ধরণের জন্য সমর্থন। উদাহরণস্বরূপ Int বৈশিষ্ট্যগুলি গণনা এবং সংশোধন করা যেতে পারে তবে Int? বৈশিষ্ট্যগুলি পারে না। প্রতিচ্ছবি / মিরর টাইপ ব্যবহার করে ptionচ্ছিক প্রকারগুলি আংশিকভাবে গণনা করা যায়, তবে এখনও পরিবর্তিত হয়নি।
যদি কোনও শ্রেণি প্রসারিত না হয় NSObjectতবে কেবলমাত্র নতুন, খুব সীমাবদ্ধ (এবং প্রগতিতে?) প্রতিফলন কাজ করে (প্রতিফলিত / মিরর টাইপ দেখুন), যা এর শ্রেণি এবং বৈশিষ্ট্য সম্পর্কে উদাহরণ জিজ্ঞাসা করার সীমিত ক্ষমতা যুক্ত করে, তবে উপরের অতিরিক্ত বৈশিষ্ট্যগুলির কোনওটিই নয় ।
যখন এনএসবজেক্টটি প্রসারিত করবেন না, বা '@jjc' নির্দেশিকা ব্যবহার করবেন না, স্থিতিশীল- এবং vtable- ভিত্তিক প্রেরণের উপর সুইফ্ট ডিফল্ট। এটি আরও দ্রুত, তবে, ভার্চুয়াল মেশিনের অভাবে রানটাইম পদ্ধতিটি বাধা দেয় না। এই বাধাটি কোকোর একটি মৌলিক অংশ এবং নিম্নলিখিত ধরণের বৈশিষ্ট্যগুলির জন্য প্রয়োজনীয়:
সুতরাং এটির প্রস্তাবিত যে সুইফটের সাথে কোকো / কোকো টাচ প্রয়োগগুলি প্রয়োগ করা হয়েছে:
সারসংক্ষেপ:
রেফারেন্স ডেটা: পদ্ধতি অনুরোধের জন্য এক্সিকিউশন ওভারহেড:
(প্রকৃত কর্মক্ষমতা হার্ডওয়ারের উপর নির্ভর করে তবে অনুপাতটি একই রকম থাকবে)।
এছাড়াও, গতিশীল বৈশিষ্ট্যটি আমাদের সুইফটকে স্পষ্টভাবে নির্দেশ দেওয়ার অনুমতি দেয় যে কোনও পদ্ধতির গতিশীল প্রেরণা ব্যবহার করা উচিত, এবং তাই বাধা রোধকে সমর্থন করবে।
public dynamic func foobar() -> AnyObject {
}
ডকুমেন্টেশন একটি গতিশীল টাইপ সিস্টেম, প্রধানত সম্পর্কে সম্পর্কে কথা বলে
Type এবং dynamicType
দেখুন Metatype টাইপ করুন (ভাষা রেফারেন্স মধ্যে)
উদাহরণ:
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!"
}
বর্তমানে, কোনও প্রতিবিম্ব কার্যকর করা হয়নি।
সম্পাদনা: আমি স্পষ্টতই ভুল ছিলাম, স্টিভেক্সের উত্তর দেখুন। বৈশিষ্ট্যগুলি বিল্ট ইন করার জন্য কিছু সাধারণ পঠনযোগ্য প্রতিচ্ছবি রয়েছে যা সম্ভবত আইডিইগুলিকে অবজেক্ট সামগ্রীগুলি পরিদর্শন করার অনুমতি দেয়।
দেখে মনে হচ্ছে যে এই মুহুর্তে অ্যাপলের জন্য একটি সুইফ্ট প্রতিবিম্ব এপিআই কোনও উচ্চ অগ্রাধিকার নয়। তবে @ স্টেভেক্স উত্তরের পাশাপাশি স্ট্যান্ডার্ড লাইব্রেরিতে আরও একটি ফাংশন রয়েছে যা সহায়তা করে।
বিটা 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 () ব্যবহার করে বিবেচনা করতে চাইতে পারেন । এটি সর্বজনীন এবং এটি যে কোনওClass এ যেমন কাজ করে যেমন পার্থক্য সহ যেমন _stdlib_getTypeName () ঠিক তেমন কাজ করে , যেমন একটি খেলার মাঠের প্রবেশ
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)
}
jsondeserialization