সুইফট নেটিভ বেস ক্লাস বা এনএসবজেক্ট


105

আমি সুইফটের সাথে কিছু আইসা সুইজলিং পরীক্ষা করে দেখেছি এবং এটি কেবল তখনই কাজ করে যখন এনএসবজেক্টটি একটি সুপার-ক্লাস (সরাসরি বা আরও উপরে) হয়, বা '@jjc' সজ্জা ব্যবহার করে। অন্যথায় এটি সি ++ এর মতো একটি স্ট্যাটিক- এবং vtable- প্রেরণের শৈলী অনুসরণ করবে।

কোকো / এনএসবজেক্ট বেস ক্লাস ব্যতীত একটি সুইফ্ট ক্লাসটি সংজ্ঞায়িত করা কি স্বাভাবিক? যদি এটি উদ্বিগ্ন হয় তবে এর অর্থ উদ্দেশ্য সি-এর গতিশীলতার অনেকটা পূর্বসূচী, যেমন পদ্ধতি বাধা এবং রান-টাইম অন্তঃনির্ধারণ।

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

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

তবে সাধারণ 95-5 টি নিয়ম দেওয়া ( 95% পারফরম্যান্স লাভের কোডের 5% টিউনিং থেকে আসে ), শক্তিশালী গতিশীল বৈশিষ্ট্যগুলি দিয়ে শুরু করা এবং প্রয়োজনীয় যেখানে কঠোর হওয়া কি বোধগম্য নয়?


সম্পর্কিত: সুইফট দিক ভিত্তিক প্রোগ্রামিং সমর্থন করে? stackoverflow.com/a/24137487/404201
জ্যাস্পার ব্লুজ

উত্তর:


109

সুইফ্ট ক্লাসগুলি যা এনএসবজেক্টের সাবক্লাস হয়:

  • অবজেক্টিভ-সি ক্লাসগুলি নিজেরাই
  • objc_msgSend()তাদের বেশিরভাগ পদ্ধতিগুলিতে কল করার জন্য ব্যবহার করুন
  • (বেশিরভাগ) তাদের পদ্ধতি প্রয়োগের জন্য অবজেক্টিভ-সি রানটাইম মেটাডেটা সরবরাহ করুন

সুইফ্ট ক্লাসগুলি যা এনএসবজেক্টের সাবক্লাস নয়:

  • অবজেক্টিভ-সি ক্লাস, তবে এনএসবজেক্টের সামঞ্জস্যের জন্য কেবল কয়েকটি মুখ্য পদ্ধতি প্রয়োগ করুন
  • objc_msgSend()তাদের পদ্ধতিগুলিতে কল করার জন্য ব্যবহার করবেন না (ডিফল্টরূপে)
  • তাদের পদ্ধতি প্রয়োগের জন্য অবজেক্টিভ সি রানটাইম মেটাডেটা সরবরাহ করবেন না (ডিফল্টরূপে)

সুইফটে সাবস্ক্লাসিং এনএসবজেক্ট আপনাকে উদ্দেশ্য-সি রানটাইম নমনীয়তা দেয় তবে উদ্দেশ্য-সি পারফরম্যান্স দেয়। যদি আপনার উদ্দেশ্য-সি এর নমনীয়তা প্রয়োজন না হয় তবে এনএসবজেক্ট এড়ানো কার্যকারিতা উন্নত করতে পারে।

সম্পাদনা:

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

public dynamic func foobar() -> AnyObject {
}

1
Obc_msgSend এর পরিবর্তে সুইফ্ট কোন ধরণের প্রেরণ ব্যবহার করে? এটা কি স্থির?
বিল

12
সুইফট obc_msgSend প্রেরণ, ভার্চুয়াল টেবিল প্রেরণ, সরাসরি প্রেরণ, বা ইনলাইনিং ব্যবহার করতে পারে।
গ্রেগ পার্কার

স্থির: কম তারপর 1.1ns। vtable 1.1ns, 4.9ns পাঠান। । (অবশ্যই হার্ডওয়্যার উপর নির্ভর করে)। । এটি 'খাঁটি' বলে মনে হচ্ছে সিস্টেম-লেভেল প্রোগ্রামিংয়ের জন্য সুইফট দুর্দান্ত ভাষা তৈরি করেছে, তবে অ্যাপ্লিকেশনগুলির জন্য, আমি গতিশীল বৈশিষ্ট্যগুলি পূর্বে ফিরতে অনিচ্ছুক হব, যদিও তারা আবশ্যকভাবে আবর্জনা সংগ্রহ বনাম এআরসি-র সংকলকটিতে চলে গেলে আমি খুশি হব। । । আমি শুনেছি যে স্ট্যাটিক প্রেরণা মাল্টি-কোর সিটেমগুলিতে আরও ভাল শাখার পূর্বাভাস (এবং এইভাবে পারফরম্যান্স) করতে দেয়। সত্য?
জ্যাস্পার ব্লুজ

"এনএসবজেক্টের সাবক্লাস নয় এমন সুইফ্ট ক্লাসগুলি ওজেক্টিভ-সি ক্লাসগুলি" - আপনি যে বিবৃতিটি পেয়েছেন সেখানে কোনও লিঙ্ক সরবরাহ করতে পারবেন?
ম্যাট এস।

1
সুতরাং সংক্ষেপে আমার যদি কেবল ওবজেক্টিভ সি কোডের সাথে যোগাযোগের প্রয়োজন হয় তবে কেবল সুইফটে এনএসবজেক্ট সাবক্লাস করা উচিত?
মোবাইলমান

14

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

এই উদাহরণে, যেখানে আমরা এনএসবজেক্টের ভিত্তি করি না , সংকলকটি সঠিকভাবে পরীক্ষার ত্রুটিটিকে দাগ দেয় ncআরঙ্করেক্ট_কম্পিলারশোল্ডস্পট, "... 'মাইক্লাস' 'মিররডিসপজিশন'" তে রূপান্তরিত নয় "

class MyClass {
  let mString = "Test"

  func getAsString() -> String {
    return mString
  }

  func testIncorrect_CompilerShouldSpot() {
    var myString = "Compare to me"
      var myObject = MyClass()
      if (myObject == myString) {
        // Do something
      }
  }

  func testCorrect_CorrectlyWritten() {
    var myString = "Compare to me"
      var myObject = MyClass()
      if (myObject.getAsString() == myString) {
        // Do something
      }
  }
}

এই উদাহরণে, যেখানে আমরা উপর বেস NSObject , কম্পাইলার নেই testIncorrect_CompilerShouldSpot ত্রুটি স্পট:

class myClass : NSObject {
  let mString = "Test"

  func getAsString() -> String {
    return mString
  }

  func testIncorrect_CompilerShouldSpot() {
    var myString = "Compare to me"
      var myObject = MyClass()
      if (myObject == myString) {
        // Do something
      }
  }

  func testCorrect_CorrectlyWritten() {
    var myString = "Compare to me"
      var myObject = MyClass()
      if (myObject.getAsString() == myString) {
        // Do something
      }
  }
}

আমি অনুমান করি যে নৈতিকতা কেবলমাত্র এনএসবজেক্টের ভিত্তিতে যেখানে আপনাকে সত্যই করতে হবে!


1
তথ্যের জন্য ধন্যবাদ।
জ্যাস্পার ব্লুজ

13

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

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

ভাষার রেফারেন্স থেকে:

সুইফ্ট ক্লাসগুলি সর্বজনীন বেস বর্গ থেকে উত্তরাধিকারসূত্রে আসে না। একটি সুপারক্লাস নির্দিষ্ট না করে আপনি সংজ্ঞায়িত ক্লাসগুলি স্বয়ংক্রিয়ভাবে আপনার উপর ভিত্তি করে বেস ক্লাস হয়ে যায় classes

superসুপার ক্লাস (অর্থাত্ একটি বেস ক্লাস) ব্যতীত কোনও শ্রেণি থেকে রেফারেন্স দেওয়ার চেষ্টা করার ফলে একটি সংকলন সময় ত্রুটি হবে

'super' members cannot be referenced in a root class

1
হ্যাঁ। যদি আপনি কোনও প্রকল্পের প্রসঙ্গে কোকো বা কোকো টাচ সোর্স ফাইল তৈরি করার চেষ্টা করেন তবে আপনি যে ফর্মটিতে সাবক্লাসটি সন্নিবেশ করিয়েছেন তা প্রকৃতপক্ষে ফাঁকা রেখে ক্লাস তৈরি করা থেকে বিরত রাখে। সুপারক্লাসটি তৈরি হয়ে গেলে পরে তা মুছে ফেলতে পারেন।
সেজার

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

1

আমি বিশ্বাস করি যে স্যুইফ্টের বিশাল সংখ্যক ডেটা হবে না objc। কেবলমাত্র সেই অংশগুলির জন্য যেগুলি Te Objective C অবকাঠামোগত যোগাযোগের প্রয়োজন তা স্পষ্টভাবে চিহ্নিত করা হবে।

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


আমার কাছে এটি গতিশীলতাটিকে ডিফল্ট হিসাবে বিবেচনা করে তোলে ('@jjc' সজ্জা বা অন্য কোনও পদ্ধতির ব্যবহার করে NSObject প্রসারিত করার মাধ্যমে)। দেখে মনে হয় যখন কোনও বেস ক্লাস নেই, সুইফট স্ট্যাটিক / ভিটিবেল প্রেরণের পক্ষে হবে, যা আরও ভাল পারফর্ম করে তবে বেশিরভাগ ক্ষেত্রে এটি প্রয়োজনীয় হবে না। । (লাভের 90% কোডের 10% টিউনিং থেকে আসে)। আমার আশা হ'ল অবজেক্টিভ-সি এর গতিশীলতার সাথে সামঞ্জস্যতা অপ্ট-ইন করার পরিবর্তে অপ্ট-আউট।
জ্যাস্পার ব্লুজ

ভাষাটি যেভাবে ডিজাইন করা হয়েছে, এটি optionচ্ছিক অপ্ট-ইন। যতদূর আমরা জানি এটি খুব ভালভাবে হতে পারে যে ভবিষ্যতে সিস্টেমে এপিআইগুলি যুক্ত করা হবে যা স্থানীয়ভাবে অবজেক্ট নয়। মাঝারি / দীর্ঘ মেয়াদে তারা এমনকি বিদ্যমান লাইব্রেরিগুলিকে অ-অবজেক কোডে অজেক্টে একটি পাতলা সামঞ্জস্যতা স্তর সহ স্থানান্তর করতে পারে যা নন অবজেক কোডে কল করে। আমরা শুধু জানি না। আমরা সম্ভবত educated guessesএখন থেকে কয়েক বছরের মধ্যে তৈরি করতে সক্ষম হব । তবে এই মুহুর্তের জন্য এটি কেবল একটি বড় প্রশ্ন চিহ্ন।
অ্যানালগ ফাইল

@ জ্যাসপার ব্লুস আমি যুক্তি দিয়ে বলব যে গতিশীলতার বেশিরভাগ সময় প্রয়োজন হয় না এবং আমি বরং ডিফল্টরূপে পারফরম্যান্স করতাম এবং তারপরে গতিশীল আচরণের পক্ষে বেছে নেওয়া দরকার। প্রত্যেকের নিজের অনুমান আমি :)
ল্যান্স

নিবন্ধ হতে পারে. আমি এখনও উদ্বিগ্ন: পর্যবেক্ষক, এওপি, পরীক্ষামূলক উপহাস ফ্রেমওয়ার্ক, অ্যানালিটিক ফ্রেমওয়ার্ক ইত্যাদি। এবং কর্মক্ষমতা সম্পর্কে জিনিস 90% লাভ 10% টিউনিং থেকে আসে। । সুতরাং এটি আমার যুক্তি - এই 10% ক্ষেত্রে বেছে নিন। আমি মনে করি আইওএস এন্টারপ্রাইজ অ্যাপ্লিকেশনগুলির জন্য এওপি একটি বড় চুক্তি হবে, তবে এটি সি ++ তে রয়েছে বলে সংকলক সরঞ্জামটি ব্যবহার করে করা যেতে পারে। । অবশ্যই গেমস, বৈজ্ঞানিক কম্পিউটিং, গ্রাফিক্স, ইত্যাদির আরও পারফরম্যান্সকে স্বাগত জানাবে :)
জ্যাস্পার ব্লুজ

1

নিম্নলিখিতটি অ্যাপলের সুইফট-ইবুক থেকে অনুলিপি করা হয়েছে এবং আপনার প্রশ্নের উপযুক্ত উত্তর দেয়:

একটি বেস-ক্লাস সংজ্ঞায়িত

অন্য শ্রেণীর উত্তরাধিকারসূত্রে প্রাপ্ত না এমন কোনও শ্রেণি একটি বেস শ্রেণি হিসাবে পরিচিত।

সুইফ্ট ক্লাসগুলি সর্বজনীন বেস বর্গ থেকে উত্তরাধিকারসূত্রে আসে না। একটি সুপারক্লাস নির্দিষ্ট না করে আপনি সংজ্ঞায়িত ক্লাসগুলি স্বয়ংক্রিয়ভাবে আপনার উপর ভিত্তি করে বেস ক্লাস হয়ে যায়।


উল্লেখ

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html#//apple_ref/doc/uid/TP40014097-CH17-XID_251


-6

এটা স্বাভাবিক। সুইফটের ডিজাইনের লক্ষ্যগুলি দেখুন: লক্ষ্যটি হ'ল বিশাল ক্লাসের প্রোগ্রামিং সমস্যাগুলি অদৃশ্য হয়ে যায়। আপনি সুইফটের সাথে যে কাজটি করতে চান তার মধ্যে সম্ভবত পদ্ধতি সুইজলিং নয়।


3
রানটাইমে ইন্টারসেপ্ট প্যাটার্ন অর্জনের জন্য পদ্ধতি সুইজলিং একটি উপায়। এর ব্যবহারগুলির মধ্যে একটি হ'ল पहलू ওরিয়েন্টেড প্রোগ্রামিংয়ের নীতি অনুসারে ক্রস কাটিং উদ্বেগগুলি প্রয়োগ করা। অ্যাপলের নিজস্ব বিজ্ঞপ্তিগুলি, সম্পত্তি পর্যবেক্ষকরা (বিল্ট ইন ইন সুইফট), মূল ডেটা সবগুলিই সাফল্যের জন্য সুইজলিং ব্যবহার করে। । উদ্বেগ বাক্য গঠন সত্ত্বেও ওজেক্টিভ-সি-তে লোককে মোহিত করে এমন একটি বিষয় ছিল এই গতিশীলতা, যখনই যখন বিরতি বিন্যাস প্রয়োজন হয় তখন মার্জিত সমাধানগুলি সরবরাহ করা সহজ করে তোলে। । আসলে ওবজকের পক্ষে কোনও আনুষ্ঠানিক এওপি কাঠামো ছিল না, কারণ কাঁচামালগুলি এত ভাল ছিল।
জ্যাস্পার ব্লুজ

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

1
হ্যাঁ, তবে এই সমস্ত কিছুই ইন্টারসেপেশানের উপর নির্ভর করে, যা দুটি উপায় করতে পারে: সংকলন-সময় (সি ++) বা রানটাইম (রুবি, অবজেক্টিভ-সি, জাভা (asm, cglib, ApsectJ, ইত্যাদি) এর মাধ্যমে)। আধুনিক ভাষাগুলি রানটাইমে এটি করার ঝোঁক। লোকেরা অবজেক্টিভ-সি পছন্দ করত, কারণ এটি একটি পুরানো কোডার হয়েও একটি আধুনিক ভাষার মতো আচরণ করে। আপনি যেমন বলছেন, এর মধ্যে আরও বেশি যা ভাষায় বেকড হয় (এটি ভালভাবে সরবরাহিত হয়!)। । তবে আপাতত আমরা ওবজেসি / ফাউন্ডেশন দ্বারা সরবরাহিত উত্তরাধিকারের দিকে ঝুঁকতে পারি, এ কারণেই আমি আশা করি যে এনএসবজেক্টকে প্রসারিত করা পরবর্তী কয়েক বছরের জন্য প্রতিদিনের অ্যাপ্লিকেশনগুলির জন্য স্ট্যান্ডার্ড অনুশীলন হয়ে উঠবে।
জেস্পার ব্লুজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.