সুইফট রেফারেন্সের _ আন্ডারস্কোর প্রতিনিধি কী?


144

অ্যাপলের ডক্সের রেফারেন্স বিভাগে এই ধরণের জিনিসগুলির প্রচুর উদাহরণ রয়েছে:

func runAction(_action: SKAction!)

এর উদ্দেশ্য-সি 'সমতুল্য' হ'ল:

- (void)runAction:(SKAction *)action

এটি আমাকে আঘাত করে যে সম্ভবত এটি গুরুত্বপূর্ণ যে (সুইফ্ট রেফারেন্সে) আন্ডারস্কোর এবং ইটালিকসে "অ্যাকশন" লেখা হওয়ার পরে একটি জায়গা রয়েছে।

তবে আমি বোঝাতে পারছি না এটি কী জানাতে চাইছে। সুতরাং সম্ভবত প্রশ্নটি ... রেফারেন্সগুলিতে রেফারেন্সগুলি ব্যবহৃত হয়?

- এই পৃষ্ঠাটি আমি নীচে ব্যবহারের নীচে এই রেফারেন্সটিতে উল্লেখ করছি: https://developer.apple.com/docamentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction

হালনাগাদ

ফাংশন / পদ্ধতির পরামিতিগুলির নাম এবং যুক্তি লেবেলগুলি কীভাবে ব্যবহৃত হয় এবং নাম দেওয়া হয় তাতে সুইফ্ট 3 কিছু পরিবর্তন করেছে। এটিতে এই প্রশ্নের উত্তর এবং উত্তর রয়েছে। @ রিক্সার ফাংশনগুলিতে _উন্ডসরগুলি সম্পর্কে একটি পৃথক প্রশ্নের উত্তর দেওয়ার জন্য একটি আশ্চর্যজনক কাজ করে যা এখানে বেশিরভাগ পরিষ্কার করে দেয়: আমাকে কেন দ্রুত গতিতে আন্ডারস্কোর প্রয়োজন?


3
[আন্ডারস্কোর.জেএস] দিয়ে ট্যাগ করেছেন ??
মার্টিন আর

3
ডকুমেন্টেশনটি পরিবর্তনশীল নামের জন্য ইটালিক্স ব্যবহারের গাণিতিক কনভেনশন অনুসরণ করছে। উদাহরণস্বরূপ: sin² a + cos² a = 1.
রব মায়োফ

উত্তর:


116

উভয় উত্তর সঠিক ছিল তবে আমি আরও কিছুটা স্পষ্ট করতে চাই।

_করতে ব্যবহৃত হয় পদ্ধতি জন্য বহিরাগত প্যারামিটার নাম আচরণ সংশোধন

ইন স্থানীয় ও পদ্ধতি জন্য বাহ্যিক প্যারামিটার নাম নথিপত্রের অধ্যায়, এটা বলেন:

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

অন্যদিকে, ডিফল্টরূপে ফাংশনগুলির বাহ্যিক প্যারামিটারের নাম থাকে না।

উদাহরণস্বরূপ, আমাদের foo()ক্লাসে এই পদ্ধতিটি সংজ্ঞায়িত করা হয়েছে Bar:

class Bar{
    func foo(s1: String, s2: String) -> String {
        return s1 + s2;
    }
}

আপনি যখন ফোন করেন তখন foo()এটিকে পছন্দ করা হয় bar.foo("Hello", s2: "World")

তবে , যেখানে এটি ঘোষিত _হয়েছে তার সামনে ব্যবহার করে আপনি এই আচরণটি ওভাররাইড করতে পারেন s2

func foo(s1: String, _ s2: String) -> String{
    return s1 + s2;
}

তারপরে, আপনি যখন কল করবেন তখন এটি দ্বিতীয় প্যারামিটারের নাম fooবাদে বলা যেতে পারে bar.foo("Hello", "World")

আপনার ক্ষেত্রে ফিরে আসুন runActionএকটি পদ্ধতি কারণ এটি প্রকারের সাথে সম্পর্কিত SKNode, স্পষ্টতই। সুতরাং, একটি _প্যারামিটার পূর্বে স্থাপন করা actionআপনাকে runActionবাহ্যিক নাম ছাড়াই কল করতে দেয় ।

সুইফট ২.০ এর জন্য আপডেট

স্থানীয় এবং বাহ্যিক আর্গুমেন্ট নাম ঘোষণার ক্ষেত্রে ফাংশন এবং পদ্ধতি এখন একইভাবে কাজ করে

ডিফল্টরূপে বাহ্যিক প্যারামিটারের নামটি ব্যবহার করে ২ য় প্যারামিটার থেকে শুরু করে ফাংশনগুলি ডাকা হয়। এই বিধিটি কেবল খাঁটি সুইফ্ট কোডের ক্ষেত্রে প্রযোজ্য।

সুতরাং, _কোনও ফাংশনটির সামনে একটি সরবরাহ সরবরাহ করার মাধ্যমে , কলকারীকে আপনাকে কোনও পদ্ধতির জন্য কী করতে হবে ঠিক যেমন বহিরাগত প্যারামিটার নাম নির্দিষ্ট করতে হবে না ।


9
বিভ্রান্ত, যদি _দ্বিতীয় প্যারামিটারের আগে লেখাটি থাকে তবে আপনার উত্তর পরিষ্কারভাবে যথেষ্ট; কি যদি func runAction(_action: SKAction!), _প্রথম প্যারামিটার আগে অথবা যদি আপনি নিম্নলিখিত কোড লিখতে func foo(_ s1: String) { // your code }Xcode আপনি সতর্ক, কিন্তু অনেক কোডের মত আছে func bringSubviewToFront(_ view: UIView)রেফারেন্স, কেন?
ঝাং

10
সুতরাং মূলত, এটি অকারণে এটি করে এবং কেবল সবাইকে বিভ্রান্ত করে। অসাধারণ.
বটবট

2
একটি আন্ডারস্কোর 'ওয়াইল্ডকার্ড প্যাটার্ন' হিসাবে পরিচিত হয় developer.apple.com/library/ios/documentation/Swift/Conceptual/...
user2143356

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

4
এটি উল্লেখ করা গুরুত্বপূর্ণ যে সুইফট ৩.০ জিনিস পরিবর্তন করে। আপনি অন্যথায় নির্দিষ্ট না করে সমস্ত লেবেল প্রয়োজনীয়। সুতরাং -প্রথম প্যারামিটারটি আর বহিরাগত নয়। উদাহরণস্বরূপ: override func viewWillAppear(_ animated: Bool)সংকেত যে কলার (উদ্দেশ্য-সি কোড) কোনও পরামিতি লেবেল ব্যবহার করবে না
মিঃ টি

85

আন্ডারস্কোর হ'ল একটি সাধারণ টোকেন যা একটি ফেলে দেওয়া মানকে নির্দেশ করতে ব্যবহৃত হয়।

এই নির্দিষ্ট ক্ষেত্রে, এর অর্থ হল যে ফাংশনটির runAction(argument)পরিবর্তে অনুরোধ করা হবেrunAction(action:argument)

অন্যান্য প্রসঙ্গে এটির অনুরূপ অন্য অর্থ রয়েছে, যেমন:

for _ in 0..<5 { ... }

এর অর্থ হল যে আমরা কেবলমাত্র 5 বার ব্লকটি কার্যকর করতে চাই এবং আমরা ব্লকের মধ্যে থাকা সূচকের বিষয়ে চিন্তা করি না।

এই প্রসঙ্গে:

let (result, _) = someFunctionThatReturnsATuple()

এর অর্থ হ'ল আমরা টিউলের দ্বিতীয় উপাদানটি কী তা প্রথম যত্নবান তা বিবেচনা করি না।


সুতরাং এই ক্ষেত্রে যুক্তি (একটি ক্রিয়া) একটি বিকল্প?
বিভ্রান্ত

1
না, এটি বাহ্যিক প্যারামিটারের নাম (ক্রিয়া :) এই ক্ষেত্রে খালি রাখায়, এইভাবে বাদ দেয়। যুক্তিটি এখনও প্রয়োজনীয়, এটি কেবল ক্রিয়াতে ট্যাগ করা হয়নি:।
ডেভিড বেরি

4
আসল উত্তরটি @ ড্যাসব্লিংক্লাইটলাইটের উত্তর এবং আমার সংমিশ্রণ। তিনি এই নির্দিষ্ট কেসটিকে আরও স্পষ্টভাবে সম্বোধন করেন, যেখানে আমার বিস্তৃত প্রশ্নকে উদ্দেশ্য করে, _ এর অর্থ কী?
ডেভিড বেরি

4
আপনি আরও বড় সংখ্যার জন্য এটিকে আরও পঠনযোগ্য করে তোলার জন্য ফেলে দেওয়া চিহ্নটিও ব্যবহার করতে পারেনlet pi = 3.141_592_653_59
এসএমপি

মজাদারভাবে, আপনি এটি খুব বড় সংখ্যাকে কম পঠনযোগ্য করতেও ব্যবহার করতে পারেন, যেমনlet pi = 3.1_4_15_92___63
ডেভিড বেরি

15

যেহেতু সুইফ্ট 3 সমস্ত আর্গুমেন্ট লেবেল ডিফল্টরূপে প্রয়োজন ।

আপনি কোনও আইডিই দিয়ে আর্গুমেন্ট লেবেলটি আড়াল করতে বাধ্য করতে পারেন _

func foo(a: String) {
}

func foo2(_ a: String) {
}

বলা হয় foo(a: "abc")এবংfoo2("abc")

নোট: এই ব্যবহার করা যেতে পারে শুধুমাত্র যখন aহয় (বহিরাগত) যুক্তি ট্যাগ এবং (অভ্যন্তরীণ) পরিবর্তনশীল নাম একই সময়ে। এটি সমতুল্য - func foo(a a: String)গ্রহণ করবে না _

অ্যাপল কেন এটি ব্যবহার করছে?

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

মতো কাজগুলির applicationWillResignActive(_ application: UIApplication)হবে অপ্রয়োজনীয় প্যারামিটার নাম applicationযেহেতু আগে থেকেই, আবেদন এটা ফাংশন নামে।

আপনার উদাহরণ

func runAction(_ action: SKAction!)বলা হবে ছাড়া এটা _মত চিহ্ন runAction(action:)। প্যারামিটার নাম actionহবে অপ্রয়োজনীয় যেহেতু ইতিমধ্যে ফাংশন নামে একটি। এটি উদ্দেশ্য এবং কেন এটি সেখানে।


13

প্যারামিটার ঘোষণার সামনের একটি সনাক্তকারী একটি বাহ্যিক প্যারামিটার নাম সংজ্ঞায়িত করে । এই নামটি যা ফাংশনটি কল করার সময় অবশ্যই কলার সরবরাহ করতে হবে:

func someFunction(externalParameterName localParameterName: Int)

আপনি যদি কোনও বাহ্যিক নাম না সরবরাহ করেন তবে আপনি যে কোনও ডিফল্ট প্যারামিটার নির্ধারণ করেছেন তাতে সুইফট একটি স্বয়ংক্রিয় বাহ্যিক নাম সরবরাহ করে। বাহ্যিক প্যারামিটার নামের জন্য আন্ডারস্কোর ব্যবহার করা এই আচরণ থেকে বেরিয়ে আসে:

আপনি _প্যারামিটারটি সংজ্ঞায়িত করার সময় একটি স্পষ্ট বাহ্যিক নামের পরিবর্তে আন্ডারস্কোর ( ) লিখে এই আচরণ থেকে বেরিয়ে আসতে পারেন ।

আপনি এখানে ডিফল্ট মান সহ প্যারামিটারগুলির জন্য বাহ্যিক নামগুলির বিভাগে এই আচরণ সম্পর্কে আরও পড়তে পারেন ।


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

4
@ কনফিউজড আমার বোধগম্যতা হ'ল SKডিজাইনাররা চান না যে আপনি actionদু'বার লিখবেন , কারণ "ক্রিয়া" ইতিমধ্যে ফাংশনের নামের একটি অংশ is অন্য কথায়, তারা আপনাকে লিখতে চায় না sprite.runAction(action:moveGroundSpritesForever)। বাহ্যিক প্যারামিটার নামের উদ্দেশ্যটি ছিল আপনার কোডটিকে "একটি বাক্যের মতো পড়া" করা; actionদুবার ব্যবহার করা এর উদ্দেশ্যকে পরাস্ত করবে।
dasblinkenlight

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

1
তবে আন্ডারস্কোরটি কোনওরকমভাবে এই বাহ্যিক প্যারামিটারগুলির নামগুলি একটি ডিফল্ট মান দিয়ে সংজ্ঞায়িত প্যারামিটারগুলির জন্য অপ্ট আউট করার জন্য ব্যবহার করা যেতে পারে ... কীভাবে এটি সম্পন্ন হয়েছে তা এখনও দেখেনি। তাকিয়ে থাকবে।
বিভ্রান্ত

সুতরাং ... সংক্ষেপে, এটি কেবল নামযুক্ত পরামিতিগুলি এবং অরডিনাল প্যারামিটারগুলির মধ্যে স্যুইচ করে, আপনি সহজেই foo.bar(param: 'fiddle') এবং নোটের মধ্যে সহজেই টগল করতে পারেন foo.bar('fiddle') : কেবলমাত্র একটি যুক্তি দিয়ে এটি সত্যই প্রকট হয় না ... তবে একাধিক যুক্তি দিয়ে এটি খুব প্রাসঙ্গিক হয়ে যায়: foo.bar(param1: 'fiddle', param2: 'dee') বনাম foo.bar('fiddle','dee')
jrypkahauer

10

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

- (void)myFancyMethodWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName;

[someInstance myFancyMethodWithFirstName:@"John" lastName:@"Doe"];

অবিজকের সাথে সামঞ্জস্য রেখে সুইফ্ট এপিআই কলগুলি করতে আপনি প্রথম প্যারামের বাহ্যিক প্যারামিটার নামটি দমন করতে চান।

func myFancyMethodWithFirstName(_ firstName:String, lastName:String);

someInstance.myFancyMethodWithFirstName("John", lastName:"Doe")

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

5

আসলে, অ্যাপল এর ডক্সে একটি পদ্ধতি এবং পদ্ধতি ঘোষণার সংজ্ঞা দেওয়ার জন্য ব্যবহৃত প্রকৃত কোডের মধ্যে পার্থক্য রয়েছে। এর করা যাক UIControl এর - addTarget: কর্ম: forControlEvents: উদাহরণস্বরূপ পদ্ধতি, বাস্তব কোড হল: এখানে চিত্র বর্ণনা লিখুন

তবে দস্তাবেজগুলিতে এটি এর মতো প্রদর্শিত হয় (লক্ষ্যমাত্রার আগে _ বিজ্ঞপ্তি): এখানে চিত্র বর্ণনা লিখুন

আসল কোডে, _ দ্বিতীয় বা পরবর্তী প্যারামিটারের বাহ্যিক নাম উপস্থিত না হওয়ার জন্য ব্যবহৃত হয় যখন কোনও পদ্ধতি বলা হয়, যখন ডক্সে _ প্যারামিটারের স্থানীয় নামটি ইঙ্গিত করে যে আপনি যখন কোনও পদ্ধতি বা ফাংশন কল করেন তখন আপনাকে কোনও সরবরাহ করা উচিত নয় বাহ্যিক নাম

কোনও ফাংশন ডিফল্টরূপে ডাকা হয় না যদি না আপনি নিজের নিজের সরবরাহ করেন বা প্যারামিটারের স্থানীয় নামের পূর্বে # যুক্ত না করেন (উদাহরণস্বরূপ, আমরা এইভাবে প্রেরণ_পরিবর্তন করি : এখানে চিত্র বর্ণনা লিখুন

এবং দস্তাবেজে, এটি এর মতো প্রদর্শিত হবে (তিনটি বিজ্ঞপ্তি দেখুন): এখানে চিত্র বর্ণনা লিখুন

ফাংশনের ঘোষণার কনভেনশন হ'ল ঠিক যেমনটি আমি পদ্ধতির জন্য বর্ণনা করেছি।


1

আরও দৃশ্যমানভাবে।

এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন যে _কেবলমাত্র স্থানীয় প্যারামিটারের নামটি বাদ দিন not

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