সুইফট প্রতিবিম্ব সমর্থন করে?


113

সুইফট প্রতিবিম্ব সমর্থন করে? যেমন মত সেখানে কিছু valueForKeyPath:এবং setValue:forKeyPath:সুইফট অবজেক্টের জন্য?

আসলে কী এটিতে গতিশীল টাইপ সিস্টেমও আছে, obj.classঅবজেক্টিভ-সি এর মতো কিছু ?


1
আমি সুইফটে প্রতিবিম্বের জন্য একটি সহায়ক শ্রেণি তৈরি করেছি। আপনি এটি এখানে খুঁজে পেতে পারেন: github.com/evermeer/EVRifલેક્શન
এডউইন

2
তারা সুইফট ২.০ এর মধ্যে প্রতিফলন সরিয়ে ফেলেছে। এই আমি বৈশিষ্ট্যাবলী enumerating করছি এবং মান লিংক
mohacs

উত্তর:


85

দেখে মনে হচ্ছে কিছু প্রতিফলন সমর্থন শুরু হয়েছে:

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


5
ঠিক আছে, আমি এটিকে বাস্তব প্রতিচ্ছবি হিসাবে বিবেচনা করব না। একটি বিষয়, এটি কেবল পঠনযোগ্য। আমার কাছে মনে হচ্ছে এটি এক্সকোডে ডিবাগিং সক্ষম করার জন্য একটি হ্যাক। প্রোটোকল Mirrorআসলে IDEকয়েকবার শব্দটি উদ্ধৃত করে ।
সুলতান

7
এবং এটি শুধুমাত্র সম্পত্তি জন্য কাজ করে। কোনও পদ্ধতির প্রতিবিম্ব নেই।
সুলতান

11
সংক্ষিপ্ত চেকিংয়ের লেখক W আমি ডাব্লুডাব্লুডিসিতে সুইফট ল্যাবটিতে এটি লিখেছিলাম, ভেবেছিলাম আমি এটির বাকী ভাগ করে দেব। প্রত্যেকেরই অবহিত হওয়ার সাথে সাথে, আমি যে ইঞ্জিনিয়ারদের সাথে কথা বললাম তারা নিশ্চিত করেছেন যে প্রতিচ্ছবি () ফাংশনটি খেলার মাঠকে সমর্থন করার জন্য উপস্থিত রয়েছে। তবে আপনি এটির সাথে এখনও কিছু মজা করতে পারেন :) এখানে আমি এটি ব্যবহার করে একটি সামান্য মডেল সিরিয়ালকে হ্যাক করেছি। খেলার মাঠে এটি আটকান এবং মজা করুন: gist.github.com/mchaumber/67640d9c3e2bcffbb1e2
মার্ক চেম্বারস

1
কীভাবে সহায়তা করতে পারে তা জানতে উত্তর stackoverflow.com/a/25345461/292145 দেখুন _stdlib_getTypeName
ক্লাস

1
এখানে এমন একটি শ্রেণী রয়েছে যা বেস ক্লাসগুলি এবং বিকল্পগুলির প্রতিচ্ছবি করবে (প্রকার নয়) এবং এনএসকোডিং এবং একটি অভিধান থেকে এবং পার্সিংয়ের জন্য সমর্থন আছে: github.com/evermeer/EVCloudKitDao/blob/master/appMessage/…
এডউইন

44

যদি কোনও শ্রেণি প্রসারিত হয় NSObject, তবে অবজেক্টিভ-সি এর সমস্ত আত্মপরিচয় এবং গতিশীলতা কাজ করে। এটা অন্তর্ভুক্ত:

  • কোনও শ্রেণিকে তার পদ্ধতি এবং বৈশিষ্ট্য সম্পর্কে জিজ্ঞাসা করার পদ্ধতি এবং পদ্ধতি বা সেট বৈশিষ্ট্যগুলি আহ্বান করার ক্ষমতা।
  • পদ্ধতি বাস্তবায়নের বিনিময় করার ক্ষমতা। (সমস্ত দৃষ্টিতে কার্যকারিতা যুক্ত করুন)।
  • ফ্লাইতে একটি নতুন উপ-শ্রেণি তৈরি এবং নির্ধারণের ক্ষমতা। (প্রদত্ত উদাহরণে কার্যকারিতা যুক্ত করুন)

এই কার্যকারিতার একটি ঘাটতি হ'ল সুইফ্ট alচ্ছিক মান ধরণের জন্য সমর্থন। উদাহরণস্বরূপ Int বৈশিষ্ট্যগুলি গণনা এবং সংশোধন করা যেতে পারে তবে Int? বৈশিষ্ট্যগুলি পারে না। প্রতিচ্ছবি / মিরর টাইপ ব্যবহার করে ptionচ্ছিক প্রকারগুলি আংশিকভাবে গণনা করা যায়, তবে এখনও পরিবর্তিত হয়নি।

যদি কোনও শ্রেণি প্রসারিত না হয় NSObjectতবে কেবলমাত্র নতুন, খুব সীমাবদ্ধ (এবং প্রগতিতে?) প্রতিফলন কাজ করে (প্রতিফলিত / মিরর টাইপ দেখুন), যা এর শ্রেণি এবং বৈশিষ্ট্য সম্পর্কে উদাহরণ জিজ্ঞাসা করার সীমিত ক্ষমতা যুক্ত করে, তবে উপরের অতিরিক্ত বৈশিষ্ট্যগুলির কোনওটিই নয় ।

যখন এনএসবজেক্টটি প্রসারিত করবেন না, বা '@jjc' নির্দেশিকা ব্যবহার করবেন না, স্থিতিশীল- এবং vtable- ভিত্তিক প্রেরণের উপর সুইফ্ট ডিফল্ট। এটি আরও দ্রুত, তবে, ভার্চুয়াল মেশিনের অভাবে রানটাইম পদ্ধতিটি বাধা দেয় না। এই বাধাটি কোকোর একটি মৌলিক অংশ এবং নিম্নলিখিত ধরণের বৈশিষ্ট্যগুলির জন্য প্রয়োজনীয়:

  • কোকো এর মার্জিত সম্পত্তি পর্যবেক্ষক। (সম্পত্তি পর্যবেক্ষকরা সরাসরি সুইফট ভাষায় বেকড হন)।
  • অ-আক্রমণাত্মকভাবে লগিং, লেনদেন পরিচালনা (যেমন অ্যাস্পেক্ট ওরিয়েন্টেড প্রোগ্রামিং) এর মতো ক্রস কাটিং উদ্বেগগুলি প্রয়োগ করা।
  • প্রক্সি, বার্তা ফরোয়ার্ডিং ইত্যাদি

সুতরাং এটির প্রস্তাবিত যে সুইফটের সাথে কোকো / কোকো টাচ প্রয়োগগুলি প্রয়োগ করা হয়েছে:

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

সারসংক্ষেপ:

  • দ্রুত স্ট্যাটিক / ভিটেবল প্রেরণ এবং সীমিত প্রতিচ্ছবি সহ সুইফট সি ++ এর মতো আচরণ করতে পারে। এটি এটিকে নিম্ন স্তরের বা পারফরম্যান্স নিবিড় অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত করে তোলে, তবে জটিলতা ছাড়াই, শিখার বক্ররেখা বা সি ++ এর সাথে যুক্ত ত্রুটির ঝুঁকি without
  • সুইফ্টটি একটি সংকলিত ভাষা হলেও, পদ্ধতি আহ্বানের মেসেজিং স্টাইলটি রুবি এবং পাইথনের মতো আধুনিক ভাষায় প্রাপ্ত অন্তর্মুখি এবং গতিশীলতা যুক্ত করে কেবল অবজেক্টিভ-সি এর মতো, তবে অবজেক্টিভ-সি এর উত্তরাধিকার বাক্য বিন্যাস ছাড়াই।

রেফারেন্স ডেটা: পদ্ধতি অনুরোধের জন্য এক্সিকিউশন ওভারহেড:

  • স্থির: <1.1ns
  • vtable: ~ 1.1ns
  • গতিশীল: 9 4.9ns

(প্রকৃত কর্মক্ষমতা হার্ডওয়ারের উপর নির্ভর করে তবে অনুপাতটি একই রকম থাকবে)।

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

public dynamic func foobar() -> AnyObject {
}

2
এমনকি অবজেক্টিভ-সি কৌশলগুলি ব্যবহার করে মনে হচ্ছে এটি alচ্ছিক সুইফট প্রকারের জন্য কাজ করে না। আমি উত্তরটিতে এই সীমাবদ্ধতাটি লক্ষ্য করার পরামর্শ দিচ্ছি যদি না আমি কোনও কৌশল মিস করি।
হিটনিল্যান্ড

8

ডকুমেন্টেশন একটি গতিশীল টাইপ সিস্টেম, প্রধানত সম্পর্কে সম্পর্কে কথা বলে

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

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

বিটা 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প্রকার বোঝায় ।

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


@ আলেকারসন হ্যাঁ, এটিও বেশ কার্যকর।
ক্লাস

1
সেগুলি কি ব্যক্তিগত এপিআই নয়? অ্যাপলটি যদি এগুলি ব্যবহার করা হয় তবে তারা কি অনুমোদন করবে?
এডুয়ার্ডো কস্তা

@ এডুয়ার্ডো কোস্টা হ্যাঁ, অবশ্যই তারা ব্যক্তিগত। আমি কেবল এগুলি ডিবাগ বিল্ডগুলির জন্য ব্যবহার করি।
ক্লাস


5

পরিবর্তে আপনি toString () ব্যবহার করে বিবেচনা করতে চাইতে পারেন । এটি সর্বজনীন এবং এটি যে কোনওClass এ যেমন কাজ করে যেমন পার্থক্য সহ যেমন _stdlib_getTypeName () ঠিক তেমন কাজ করে , যেমন একটি খেলার মাঠের প্রবেশ

class MyClass {}

toString(MyClass.self) // evaluates to "__lldb_expr_49.MyClass"

1

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)
}

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