সুইফটে ডকুমেন্টেশন জেনারেশন সমর্থন আছে?


238

অনেক ভাষা কোনও জেনারেটরকে (যেমন বা ডক্সিজেন ) একই কোডটি বিশ্লেষণ করে কোড ডকুমেন্টেশন তৈরি করার অনুমতি দেওয়ার জন্য ডকুমেন্টেশন মন্তব্যগুলিকে সমর্থন করে ।javadoc

সুইফটের কি কোনও ধরণের ডকুমেন্টেশন মন্তব্য বৈশিষ্ট্য রয়েছে?


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

@ Velop ডেভেলপার আমি একই অনুমান করছিলাম, তবে আমি কোনও রেফারেন্স দেখতে পাইনি বলে আমি ভাবছিলাম যে কেউ এটি নিশ্চিত করতে পারে কিনা এবং কোনও নির্দিষ্ট নথিপত্রের সরঞ্জামও আছে কিনা।
pconcepcion

1
তারা অবশ্যই ভবিষ্যতে কিছু যুক্ত করবে, // MARK:মন্তব্যটি ভবিষ্যতের এক্সকোড সংস্করণের জন্যও নির্ধারিত।
লিয়েনড্রস

অক্সিজেন-স্টাইলের মন্তব্যগুলি ক্লাসের পদ্ধতিগুলির জন্য একাধিক cave প্রচুর পরিমাণে সতর্কতার সাথে কাজ করে। আমি সবার জন্য কেবলমাত্র অক্সিজেন শৈলী ব্যবহার করব (যেমন আমি ওবজ-সি এর জন্য করেছি) এবং আশা করি এক্সকোড তাদের সমর্থন আরও উন্নত করে।
পাস্কাল

1
ব্লক প্যারামিটারগুলি ডকুমেন্ট করার জন্য, স্ট্যাকওভারফ্লো.com
লিওনার্ড

উত্তর:


386

ডকুমেন্টেশন মন্তব্যগুলি স্থানীয়ভাবে এক্সকোডে সমর্থিত, দ্রুত সহায়তায় স্মার্টলি রেন্ডারড ডকুমেন্টেশন তৈরি করে (উভয় প্রতীককে ক্লিক করার সময় এবং দ্রুত সহায়তা পরিদর্শক ⌥⌘2))

সিম্বল ডকুমেন্টেশন মন্তব্যগুলি এখন সমৃদ্ধ খেলার মাঠের মন্তব্যের দ্বারা ব্যবহৃত একই মার্কডাউন সিনট্যাক্সের উপর ভিত্তি করে তৈরি করা হয়েছে , সুতরাং আপনি খেলার মাঠে যা করতে পারেন তা এখন সোর্স কোড ডকুমেন্টেশনে সরাসরি ব্যবহার করা যেতে পারে।

সিনট্যাক্সের সম্পূর্ণ বিবরণের জন্য, মার্কআপ বিন্যাসের রেফারেন্স দেখুন । দ্রষ্টব্য যে সমৃদ্ধ খেলার মাঠের মন্তব্যসমূহ এবং প্রতীক ডকুমেন্টেশনের জন্য সিনট্যাক্সের মধ্যে কিছু বৈষম্য রয়েছে; এগুলি নথিতে নির্দেশিত (উদাহরণস্বরূপ ব্লক কোটগুলি কেবল খেলার মাঠে ব্যবহার করা যেতে পারে)।

নীচে একটি চিহ্ন এবং সিনট্যাক্স উপাদানগুলির একটি তালিকা রয়েছে যা বর্তমানে প্রতীক ডকুমেন্টেশন মন্তব্যের জন্য কাজ করে।


আপডেট

এক্সকোড 7 বিটা 4 ~- Throws: ... শীর্ষ স্তরের তালিকার আইটেম হিসাবে " " যুক্ত হয়েছে " যা দ্রুত সহায়তায় প্যারামিটারের পাশাপাশি বিবরণ ফিরিয়ে দেয়।

এক্সকোড 7 বিটা 1 Sw সুইফট 2 সহ সিনট্যাক্সে কিছু উল্লেখযোগ্য পরিবর্তন - ডকুমেন্টেশন মন্তব্য এখন মার্কডাউন (খেলার মাঠের মতো) এর উপর ভিত্তি করে।

এক্সকোড 6.3 (6D570) ~ ইনডেন্ট করা পাঠ্যটি এখন কোড ব্লক হিসাবে ফর্ম্যাট করা হয়েছে, পরবর্তী ইনডেন্টেশনগুলি নেস্ট করা হয়েছে। এ জাতীয় কোড ব্লকে ফাঁকা লাইন ছেড়ে যাওয়া সম্ভব বলে মনে হচ্ছে না - এর চেষ্টা করার ফলে ফলাফলটি কোনও অক্ষরের সাথে শেষ লাইনের শেষের দিকে সজ্জিত হবে।

এক্সকোড 6.3 বিটা back ইনলাইন কোডটি এখন ব্যাকটিক্স ব্যবহার করে ডকুমেন্টেশন মন্তব্যে যুক্ত করা যেতে পারে।


সুইফট 2 এর উদাহরণ

/// Text like this appears in "Description".
///
/// Leave a blank line to separate further text into paragraphs.
///
/// You can use bulleted lists (use `-`, `+` or `*`):
///
/// - Text can be _emphasised_
/// - Or **strong**
///
/// Or numbered lists:
///
/// 7. The numbers you use make no difference
/// 0. The list will still be ordered, starting from 1
/// 5. But be sensible and just use 1, 2, 3 etc…
///
/// ---
///
/// More Stuff
/// ==========
///
/// Code
/// ----
///
/// Use backticks for inline `code()`. Indentations of 4 spaces or more will create a code block, handy for example usage:
///
///     // Create an integer, and do nothing with it
///     let myInt = 42
///     doNothing(myInt)
///
///     // Also notice that code blocks scroll horizontally instead of wrapping.
///
/// Links & Images
/// --------------
///
/// Include [links](https://en.wikipedia.org/wiki/Hyperlink), and even images:
///
/// ![Swift Logo](/Users/Stuart/Downloads/swift.png "The logo for the Swift programming language")
///
/// - note: That "Note:" is written in bold.
/// - requires: A basic understanding of Markdown.
/// - seealso: `Error`, for a description of the errors that can be thrown.
///
/// - parameters:
///   - int: A pointless `Int` parameter.
///   - bool: This `Bool` isn't used, but its default value is `false` anyway…
/// - throws: A `BadLuck` error, if you're unlucky.
/// - returns: Nothing useful.
func doNothing(int: Int, bool: Bool = false) throws -> String {
    if unlucky { throw Error.BadLuck }
    return "Totally contrived."
}

সুইফ্ট ডকুমেন্টেশন দ্রুত সহায়তা


সুইফট 2 এর জন্য সিনট্যাক্স ( মার্কডাউনের ভিত্তিতে )


মন্তব্য স্টাইল

উভয় ///(ইনলাইন) এবং /** */(ব্লক) স্টাইলের মন্তব্য ডকুমেন্টেশন মন্তব্য তৈরির জন্য সমর্থিত। আমি ব্যক্তিগতভাবে /** */মন্তব্যে ভিজ্যুয়াল স্টাইলটি পছন্দ করি , তবে এক্সকোডের স্বয়ংক্রিয় ইনডেন্টেশন অনুলিপি / পেস্ট করার সময় এই মন্তব্য শৈলীর বিন্যাসকে নষ্ট করতে পারে কারণ এটি শীর্ষস্থানীয় সাদা স্থানকে সরিয়ে দেয়। উদাহরণ স্বরূপ:

/**
See sample usage:

    let x = method(blah)
*/

আটকানোর সময়, কোড ব্লক ইনডেন্টেশন সরানো হয় এবং এটি আর কোড হিসাবে রেন্ডার করা হয় না:

/**
See sample usage:

let x = method(blah)
*/

এই কারণে, আমি সাধারণত ব্যবহার করি ///এবং এই উত্তরের অন্যান্য উদাহরণগুলির জন্য এটি ব্যবহার করব।


উপাদানসমূহ অবরুদ্ধ করুন

শিরোনাম:

/// # My Heading

অথবা

/// My Heading
/// ==========


অনুশীর্ষক:

/// ## My Subheading

অথবা

/// My Subheading
/// -------------


অনুভূমিক নিয়ম:

/// ---


আনর্ডারড (বুলেটযুক্ত) তালিকা:

/// - An item
/// - Another item

আপনি ব্যবহার করতে পারেন + বা *আনর্ডারড তালিকার এটি সামঞ্জস্য হতে হবে।


আদেশযুক্ত (সংখ্যাযুক্ত) তালিকা:

/// 1. Item 1
/// 2. Item 2
/// 3. Item 3


কোড ব্লক:

///    for item in array {
///        print(item)
///    }

কমপক্ষে চারটি স্পেসের একটি ইন্ডেন্টেশন প্রয়োজন।


ইনলাইন উপাদানসমূহ

জোর দেওয়া (তির্যক):

/// Add like *this*, or like _this_.


শক্তিশালী (সাহসী):

/// You can **really** make text __strong__.

নোট করুন যে আপনি একই উপাদানটিতে অ্যাসিটার্কস ( *) এবং আন্ডারস্কোর ( _) মিশ্রণ করতে পারবেন না ।


ইনলাইন কোড:

/// Call `exampleMethod(_:)` to demonstrate inline code.


লিঙ্ক:

/// [Link Text](https://en.wikipedia.org/wiki/Hyperlink)


ছবি:

/// ![Alt Text](http://www.example.com/alt-image.jpg)

URL টি হয় ওয়েব ইউআরএল ("http: //" ব্যবহার করে) বা একটি নিখুঁত ফাইল পাথ URL হতে পারে (আমি কাজ করার জন্য আপেক্ষিক ফাইল পাথ পেতে পারি না)।

সমস্ত ইউআরএল একসাথে, পরিচালনাযোগ্য স্থানে রাখার জন্য লিঙ্ক এবং চিত্রগুলির জন্য ইউআরএলগুলি ইনলাইন উপাদান থেকে পৃথক করা যায়:

/// A [link][1] an an ![image][2]
///
/// ...
///
/// [1]: http://www.example.com
/// [2]: http://www.example.com/image.jpg


কীওয়ার্ড

মার্কডাউন ফর্ম্যাটিংয়ের পাশাপাশি, এক্সকোড দ্রুত সাহায্যে বিশিষ্টভাবে প্রদর্শন করতে অন্যান্য মার্কআপ কীওয়ার্ডগুলি স্বীকৃতি দেয়। এই মার্কআপ কীওয়ার্ডগুলি বেশিরভাগ বিন্যাসটি নেয় - <keyword>:(ব্যতিক্রমটি হ'ল)parameter এটিতে কোলনের আগে প্যারামিটারের নামও অন্তর্ভুক্ত থাকে), যেখানে কীওয়ার্ডটি নিজেই বড় হাতের / ছোট হাতের অক্ষরের সংমিশ্রণে রচনা করা যায়।

প্রতীক বিভাগের কীওয়ার্ড

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

মার্কআপ ফরম্যাটিং রেফারেন্সের সিম্বল সেকশন কমান্ড বিভাগে বিভাগের কীওয়ার্ড এবং তাদের উদ্দেশ্যে ব্যবহারের সম্পূর্ণ নথিভুক্ত তালিকা দেখুন ।

/// - parameters:
///   - <#parameter name#>:
///   - <#parameter name#>:
/// - throws:
/// - returns:

বিকল্পভাবে, আপনি প্রতিটি প্যারামিটারটি এভাবে লিখতে পারেন:

/// - parameter <#parameter name#>:

প্রতীক বিবরণ ক্ষেত্র কীওয়ার্ড

সহায়তার দর্শকের "বিবরণ" বিভাগের শিরোনামে নিম্নলিখিত কীওয়ার্ডগুলির তালিকা বোল্ড শিরোনাম হিসাবে প্রদর্শিত হবে । আপনার "বাক্য" বিভাগের বাকী অংশের মতো আপনি এগুলি যেভাবে লিখেছেন তাতে সেগুলি উপস্থিত হবে।

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

গুণাবলী:

/// - author:
/// - authors:
/// - copyright:
/// - date:

উপস্থিতি:

/// - since:
/// - version:

সতর্কতা:

/// - attention:
/// - important:
/// - note:
/// - remark:
/// - warning:

উন্নয়ন রাজ্য:

/// - bug:
/// - todo:
/// - experiment:

বাস্তবায়নের গুণাবলী:

/// - complexity:

কার্যকরী শব্দার্থক:

/// - precondition:
/// - postcondition:
/// - requires:
/// - invariant:

প্রতিনির্দেশ:

/// - seealso:

 ডকুমেন্টেশন রফতানি করা হচ্ছে

এইচটিএমএল ডকুমেন্টেশন (অ্যাপলের নিজস্ব ডকুমেন্টেশন নকল করার জন্য ডিজাইন করা) জাজি , একটি মুক্ত-উত্স কমান্ড-লাইন ইউটিলিটি ব্যবহার করে ইনলাইন ডকুমেন্টেশন থেকে তৈরি করা যেতে পারে ।

$ [sudo] gem install jazzy
$ jazzy
Running xcodebuild
Parsing ...
building site
jam out ♪♫ to your fresh new docs in `docs`

কনসোল উদাহরণ এই এনএসএইচপিস্টার নিবন্ধ থেকে নেওয়া


1
এক্সকোড 6.3 (6D570) এর চূড়ান্ত সংস্করণে আচরণটি পরিবর্তিত হয়েছে বলে মনে হচ্ছে। ইনডেন্টড ব্লকগুলি এখন কোডের ব্লক হিসাবে ফর্ম্যাট করা হয়েছে এবং দুটি স্তরেরও বেশি দ্বারা বাসা বাঁধতে পারে।
NexD।

2
সুইফট ২.০ ডকুমেন্টেশন সিনট্যাক্সের খুব সুন্দর বর্ণনা। আপনি অন্তর্ভুক্ত করা পোস্টে আপডেট করা উচিত/// - todo: keyword
লিওনার্দো

2
@ মুচুগাকা আসলে না। এটি পূর্বে পুনর্গঠিত পাঠের উপর ভিত্তি করে তৈরি হতে পারে তবে এক্সকোড 7 হিসাবে ডকুমেন্টেশন মন্তব্যগুলি মার্কডাউনের উপর ভিত্তি করে খেলার মাঠের মন্তব্যের মতো একই প্রাথমিক বিন্যাসে রয়েছে। দেখুন Xcode 7 রিলিজ নোট বিস্তারিত জানার জন্য।
স্টুয়ার্ট

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

1
হ্যাঁ, ব্যবহার করে /// - Tag: otherMethodএবং [otherMethod](x-source-tag://otherMethod)। আরও তথ্যের জন্য, আমার উত্তর দেখুন
ক্লে এলিস

58

এখানে কিছু জিনিস যা এক্সকোড in-এ সুইফট কোড ডকুমেন্ট করার জন্য কাজ করে এটি খুব বগি এবং কলোন সংবেদনশীল তবে এটি কিছুই না থেকে ভাল:

class Foo {

    /// This method does things.
    /// Here are the steps you should follow to use this method
    ///
    /// 1. Prepare your thing
    /// 2. Tell all your friends about the thing.
    /// 3. Call this method to do the thing.
    ///
    /// Here are some bullet points to remember
    ///
    /// * Do it right
    /// * Do it now
    /// * Don't run with scissors (unless it's tuesday)
    ///
    /// :param: name The name of the thing you want to do
    /// :returns: a message telling you we did the thing
    func doThing(name : String) -> String {
        return "Did the \(name) thing";
    }
}

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

এগুলির কোনওটিই নথিভুক্ত নয় - তাদের সাথে সহায়তার জন্য একটি রাডার ফাইল করুন।


2
Mattt থম্পসন লিখেছিলেন এই সম্পর্কে একটি নিবন্ধ , এবং তিনি মনে করেন এই হল reStructuredText
ইওনিল

উপরের উদাহরণে, প্লাস (+) এবং বিয়োগ চিহ্ন (-) চিহ্নগুলি দেখানো ক্ষুদ্রাকৃতির পাশাপাশি বুলেট পয়েন্ট হিসাবেও কাজ করবে।
ভিন্স ও'সুলিভান

মনে হচ্ছে যে একটি ফাঁকা মন্তব্য ( ///) লাইন কোন ব্যাখ্যামূলক টেক্সট এবং মধ্যবর্তী প্রয়োজন বোধ করা হয় :param:বা :returns:লাইন। এটি ছাড়ার ফলে এক্সকোড (লেখার সময় .1.১.১) ফাংশন বর্ণনার মূল অংশটিতে প্যারামিটার সহায়তা অন্তর্ভুক্ত করে।
রবিন মাচার্গ

দুর্ভাগ্যক্রমে এটি এক্সকোড 7 বিটার সাথে কাজ করে না। আশা করি তারা এটি একটি রিলিজ সংস্করণে ঠিক করবে।
stevo.mit

1
: Xcode 7 একটি ভিন্ন সিনট্যাক্স গৃহীত ericasadun.com/2015/06/14/swift-header-documentation-in-xcode-7
Zmey

41

এক্সকোড 8 এ নতুন , আপনি এর মতো একটি পদ্ধতি নির্বাচন করতে পারেন

func foo(bar: Int) -> String { ... }

তারপরে command+ option+/ টিপুন বা "কাঠামো" - এক্সকোডের "সম্পাদক" মেনু থেকে "ডকুমেন্টেশন যুক্ত করুন" চয়ন করুন এবং এটি আপনার জন্য নিম্নলিখিত মন্তব্যগুলির টেমপ্লেট তৈরি করবে:

/// <#Description#>
///
/// - parameter bar: <#bar description#>
///
/// - returns: <#return value description#>

এর জন্য ধন্যবাদ. আমি কেবল উল্লেখ করব যে আপনার নির্দেশিত কীবোর্ড শর্টকাট ডেনিশ কীবোর্ডে কাজ করছে বলে মনে হচ্ছে না, যেখানে "/" স্থানান্তরিত- "7"।
রেনিপেট

27

সুইফটে "///" মন্তব্য হ্যান্ডলিং অন্তর্ভুক্ত রয়েছে (যদিও এখনও সবকিছুই নয়)।

কিছু লিখুন:

/// Hey!
func bof(a: Int) {

}

তারপরে ফানকের নামটিতে ক্লিক করুন এবং ভয়েইল :)


11

আমি নিশ্চিত করতে পারি যে শেকেনম্যানচিল্ড পিউপার সলিউশন সরবরাহ করেছে

কেবল নিশ্চিত করুন, আপনার বর্ণনার নীচে একটি ফাঁকা রেখা আছে!

একটি অবৈধ পরিস্থিতি

সঠিক উপায়

অন্য উপায়

অন্য মন্তব্য করার স্টাইল


8

হ্যাঁ. বেস সাধারণ (আমি এর জন্য ওবজ-সি সমতুল্যর সাথে স্নিপেট তৈরি করেছি)

উদ্দেশ্য গ:

/**
 @brief <#Short description - what it is doing#>

 @discussion <#Description#>

 @param  <#paramName#> <#Description#>.

 @return <#dataType#> <#Description#>.
 */

দ্রুতগতি

/**
<#Short inline description - what it is doing#>

<#Description#>

:param:  <#paramName#> <#Description#>.

:returns: <#dataType#> <#Description#>.
*/


6

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



0

জাজি সুন্দর আপেল স্টাইলযুক্ত ডকুমেন্টেশন তৈরি করতে সহায়তা করতে পারে। কীভাবে দ্রুত ব্যবহার এবং কনফিগার করা যায় তার বিশদ সহ এখানে একটি নমুনা অ্যাপ্লিকেশন।

https://github.com/SumitKr88/SwiftDocumentationUsingJazzy


-1

অ্যাপলডক বা অ্যাপলের নিজস্ব হেডারডক যা খুব বেশি স্বীকৃত নয় তার দিকে নজর রাখা সম্ভবত একটি ভাল ধারণা । আমি এখনও 10.9 ম্যাভেরিক্স টার্মিনালে (হেডারডোক 2 এইচটিএমএল) কিছু হেডারডক ইঙ্গিত পেতে পারি

আমি সর্বশেষ " এক্সকোডে নতুন কী " * পড়ার পরামর্শ দিচ্ছি * (এটি এখনও এনডিএর অধীনে রয়েছে কিনা তা নিশ্চিত নয়) * লিঙ্কটি এক্সকোড 5.1 সংস্করণে রয়েছে যা হেডারডক সম্পর্কেও ইনফস রয়েছে।


-1

এক্সকোড 5.0 হিসাবে, ডক্সিজেন এবং হেডারডকের কাঠামোগত মন্তব্যগুলি সমর্থিত।

উৎস


1
ঠিক আছে, আমি এই ক্ষেত্রে সুইফ্ট সম্পর্কে জিজ্ঞাসা ছিল।
pconcepcion

@pconcepcion আপনি কি এক্সকোডে সুইফট ব্যবহার করছেন? তারপর হ্যাঁ.
ম্যাট জাঞ্চেলি 21

1
ম্যাট, আমি যা জানি তা থেকে (আমি ভুল হতে পারি) সুইফট এটি এক্সকোড 6 বিটা অবধি সমর্থিত নয়, তাই আমি নিশ্চিত নই যে এক্সকোড 5 এর জন্য নথিপত্রগুলি এটি
এক্সকোড

@pconcepcion এটি কাজ করে। আমি একই স্টাইলের ডক্সিজেন ডকুমেন্টেশন ব্যবহার করেছি যা আমি উদ্দেশ্য-সি-তে করেছি এবং এটি কার্যকর হয়। কোনও পদ্ধতি বা সম্পত্তির উপরে, আমি /// This is what the method does.ইত্যাদি ব্যবহার করি
ম্যাট জাঙ্কেলি

ঠিক আছে, তারপর জিনিস যে আপনি এটি Xcode 6. আমি পরীক্ষা আছে বিভ্রান্ত হয়েছে কারণ আপনি Xcode 5 সম্পর্কে কথা বলা হয়েছে এবং লিঙ্কের জন্য Xcode 5
pconcepcion
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.