2014-06-10 13 views
37

मैंने हमेशा सोचा कि कार्य और विधियां समान थीं, जब तक कि मैं "स्विफ्ट प्रोग्रामिंग भाषा" ईबुक के माध्यम से स्विफ्ट सीख रहा था। मुझे पता चला कि मैं greet("John", "Tuesday") उपयोग नहीं कर सकते एक समारोह है कि मैं एक वर्ग के अंदर घोषित कॉल करने के लिए, जैसा कि नीचे स्क्रीन शॉट में ई-पुस्तक में दिखाया गया है:स्विफ्ट में कार्यों और विधियों के बीच अंतर क्या हैं?

function declaration in swift

मैं कह रही है कि "तर्क लेबल लापता एक त्रुटि प्राप्त

-: 'दिन:' कॉल में "इस स्क्रीन शॉट के अनुसार:

Error message in swift

यहाँ कोड है 10

कुछ शोध के बाद, मुझे यह पोस्ट मिला: Difference between a method and a function, और ऐसा लगता है कि जिस वर्ग को मैंने कक्षा के अंदर घोषित किया है उसे वास्तव में एक विधि कहा जाता है। इसलिए, मैं जिस वाक्य को कॉल करने के लिए उपयोग करता हूं वह सिंटैक्स सिंटैक्स की तुलना में अलग है जिसे मैं फ़ंक्शन कॉल करने के लिए उपयोग करता हूं।

जब मैं उद्देश्य-सी में प्रोग्रामिंग कर रहा था, तो मुझे इस अंतर को कभी नहीं समझा।

  1. स्विफ्ट में कार्यों और विधियों के बीच अंतर क्या हैं?

  2. हम फ़ंक्शंस का उपयोग कब करते हैं और हम स्विफ्ट में विधियों का उपयोग कब करते हैं?

+0

के संभावित डुप्लिकेट [स्विफ्ट : कॉल में अनुपलब्ध तर्क लेबल 'xxx'] (http://stackoverflow.com/questions/24050844/swift-missing-argument-label-xxx-in-call) – user3386109

+2

मुझे नहीं लगता कि यह पूरी तरह से डुप्लिकेट है ऊपर सवाल मुझे आशा है कि यह प्रश्न स्विफ्ट में विधियों और कार्यों के बीच सभी संदेहों को साफ़ कर सकता है। जाहिर है, यह मेरे लिए काफी नया है। और मुझे लगता है कि यह कुछ अन्य आईओएस डेवलपर्स के लिए भी नया हो सकता है। – Ricky

उत्तर

36

पढ़ने और प्रयोग करने के कुछ ही घंटों के बाद, यहाँ चीजें हैं जो मुझे पता चला रहे हैं

कार्य कोड के स्वयं निहित भाग हैं जो विशिष्ट कार्य करते हैं। आप एक फ़ंक्शन को एक नाम देते हैं जो यह पहचानता है कि यह क्या करता है, और इस नाम का उपयोग आवश्यक होने पर अपने कार्य को करने के लिए फ़ंक्शन को "कॉल" करने के लिए किया जाता है।

संसाधन: Official Apple Documentation on Functions in Swift

समारोह पैरामीटर नाम

हालांकि, इन पैरामीटर नाम केवल समारोह के ही शरीर के भीतर उपयोग किया जाता है, और जब बुला नहीं किया जा सकता समारोह। ये पैरामीटर नामों के प्रकार स्थानीय पैरामीटर नाम के रूप में जाना जाता है, क्योंकि वे केवल फ़ंक्शन के शरीर के भीतर उपयोग के लिए उपलब्ध हैं।

इसका मतलब है कि डिफ़ॉल्ट रूप से, समारोह के लिए सभी मापदंडों स्थानीय पैरामीटर हैं।

लेकिन, कभी-कभी हम प्रत्येक पैरामीटर के उद्देश्य को इंगित करना चाहते हैं। इसलिए, हम वास्तव में प्रत्येक पैरामीटर के लिए बाह्य पैरामीटर नाम परिभाषित कर सकते हैं। उदाहरण कोड:

func someFunction(externalParameterName localParameterName: Int) { 
    // function body goes here, and can use localParameterName 
    // to refer to the argument value for that parameter 
} 

बाहरी पैरामीटर नाम बनाने के लिए एक और तरीका है हैश प्रतीक (#) उपयोग कर रहा है नाम छोटा करने के लिए।

func someFunction(#localParameterName: Int) { 
    // function body goes here, and can use localParameterName 
    // to refer to the argument value for that parameter 
} 

बाहरी पैरामीटर के साथ ऊपर कार्यों फोन के लिए, आपको स्विफ्ट में उपयोग कर सकते हैं

someFunction(localParameterName:10) 

तरीके

तरीके कार्यों है कि एक विशेष प्रकार के साथ जुड़े रहे हैं। कक्षाएं, संरचनाएं, और गणना सभी उदाहरण विधियों को परिभाषित कर सकते हैं, जो किसी दिए गए प्रकार के उदाहरण के साथ काम करने के लिए विशिष्ट कार्यों और कार्यक्षमता को समाहित करता है।

संसाधन: Official Apple Documentation on Methods in Swift

हालांकि, स्थानीय नाम और बाहरी नामों के डिफ़ॉल्ट व्यवहार को कार्य करता है और तरीकों के लिए अलग है।

विशेष रूप से, स्विफ्ट पहले पैरामीटर नाम एक विधि में डिफ़ॉल्ट द्वारा एक स्थानीय पैरामीटर नाम देता है, और डिफ़ॉल्ट रूप से दूसरे और बाद के पैरामीटर नाम दोनों स्थानीय और बाहरी पैरामीटर नाम देता है।

नीचे कोड स्विफ्ट में विधि के लिए डिफ़ॉल्ट और गैर-डिफ़ॉल्ट पैरामीटर के अंतर को दिखाता है।

import Foundation 
import UIKit 

class ViewController2: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     //Default methods calling 
     var dailyStatement = greet("Rick", day: "Tuesday") 
     println(dailyStatement) 

     //First parameter is also an external parameter 
     var dailyStatement2 = greet2(name:"John", day: "Sunday") 
     println(dailyStatement2) 
    } 

    //Default: First Parameter is the local parameter, the rest are external parameters 
    func greet (name: String, day: String) -> String { 
     return "Hello \(name), today is \(day)." 
    } 

    //Use Hash symbol to make the First parameter as external parameter 
    func greet2 (#name: String, day: String) -> String { 
     return "Hello \(name), today is \(day)." 
    } 
} 

मुझे कुछ महत्वपूर्ण विवरण याद आ सकते हैं। उम्मीद है कि कोई बेहतर जवाब दे सकता है।

+0

मुझे विश्वास है कि स्विफ्ट 2.0+ में # के उपयोग के साथ-साथ विधियों और कार्यों के बीच अंतर भी है। – Johan

+0

# गंगा अच्छा। इसके अलावा विभिन्न आंतरिक और बाहरी पैरामीटर नामों का पूरा विचार भी वास्तव में गूंगा है। बस इसे सी # में पसंद करें जहां इसे कॉलर पसंद के रूप में निर्दिष्ट किया जा सकता है या प्रति पैरामीटर नहीं। –

+0

वास्तव में बहुत मूल्यवान @ रिकी +1 – Kamarshad

24

जैसा कि आपने स्वयं कहा था, विधियां कार्य हैं, लेकिन एक कक्षा में। उद्देश्य-सी में आपने कभी यह महसूस नहीं किया, क्योंकि हम केवल कक्षाओं में कोडिंग कर रहे थे। हमने जो भी कार्य लिखा है वह एक वर्ग (व्यू कंट्रोलर या हमने बनाई गई किसी अन्य श्रेणी) की विधि थी।

स्विफ्ट में हमारे पास ऐसे कार्यों को बनाने की क्षमता है जो कुछ कक्षा के अंदर नहीं हैं। ऐसा करने का मुख्य कारण उन कार्यों को लिखना है जो किसी भी वर्ग से बंधे नहीं हैं, और जहां भी हमें उनकी आवश्यकता हो, इस्तेमाल किया जा सकता है। तो अगर आप एक समारोह है कि एक वर्ग से संबंधित है, तो आप यह वर्ग के भीतर लिखने और आप उपयोग कर सकते हैं वर्ग के प्रत्येक उदाहरण से है:

class Square { 
    var length: Double 
    func area() -> Double { 
     return length * length 
    } 
} 

लेकिन तुम समारोह, तो हर जगह से उपयोग करने की जरूरत है आप इसे कक्षा के भीतर नहीं लिखते हैं। उदाहरण के लिए:

func squared(number: Int) -> Int { 
    return number * number 
} 

कार्यों और विधियों के बीच आपके वाक्यविन्यास के मुद्दों के बारे में: आपने अनुमान लगाया है कि सही, विधियों और कार्यों को थोड़ा अलग कहा जाता है। इसका कारण यह है कि उद्देश्य-सी में हमारे पास लंबे विधि के नाम थे और हमें उन्हें पसंद आया क्योंकि हम पढ़ सकते थे कि विधियां क्या कर रही थीं और पैरामीटर क्या थे। इसलिए किसी विधि में पहला पैरामीटर फ़ंक्शन नाम द्वारा वर्णित अधिकांश मामलों में होता है। और अन्य पैरामीटर न केवल कुछ संख्याएं या तार या उदाहरण होना चाहिए, उन्हें भी वर्णित किया जाना चाहिए, इसलिए स्विफ्ट स्वचालित रूप से चर का नाम लिखता है।स्विफ्ट में

कार्य -: आप ऐसा कर सकते तो आप अपने आप से यह वर्णन करना चाहते हैं और साथ ही:

class Something { 
    func desc(firstString string1: String, secondString string2:String) {...} 
} 
+3

"... उद्देश्य में - आपने कभी यह महसूस नहीं किया, क्योंकि हम केवल कक्षाओं में कोडिंग कर रहे थे"। असल में, उद्देश्य-सी सी का सख्त सुपरसेट है, और यह एमएम फाइलों में भी "मुक्त" फ़ंक्शंस के लिए काफी संभव (और उपयोगी) है। कभी-कभी आपको ऐसी प्रक्रिया को परिभाषित करने की आवश्यकता होती है जो किसी भी वर्ग से बंधी न हो। –

+4

आप सही हैं। लेकिन आईओएस विकास में उपयोग किए जाने वाले वास्तविक तर्क 99.9 99% में कक्षाओं में लिखे गए थे;) – Ben

+0

सुधार के लिए धन्यवाद @ andyvn22! – Ben

1

someFile.swift:

func someFunc{ 
//some code 
} 

class someClass{ 

    func someMethod{ 
    //some code  
    } 

} 

नोट:! SomeClass = somefile

someMethod केवल उसके संबंधित प्रकार है जो 'SomeClass' है पर काम करता है। हालांकि कुछ फनक के लिए भी ऐसा नहीं कहा जा सकता है। someFunc केवल कुछ क्लास में है। स्विफ्ट क्योंकि अर्थात् यह उस फ़ाइल में लिखे जाने योग्य बेहतर है। यह किसी भी अन्य वर्ग में लिखा जा सकता था जब तक कि इसे private

3

ठीक है, @ रिकी का जवाब यह बहुत अधिक कहता है। मैं उलझन में था कि वे वास्तव में क्या हैं। तो यहां मेरा विचार है:

कार्यों को कक्षाओं या कक्षाओं/structs/enums के अंदर परिभाषित किया जा सकता है, जबकि विधियों को कक्षाओं/structs/enums के अंदर और हिस्से के अंदर परिभाषित किया जाना चाहिए।

हम किसी भी प्रकार की परिभाषा के बाहर एक समारोह को परिभाषित कर सकते हैं और किसी भी प्रकार की परिभाषा के तरीकों के भीतर इसका उपयोग कर सकते हैं।

बस मेरी समझ और यहाँ चित्रण, उम्मीद है कि इस किसी और में मदद करता है या आप संपादित कर सकते हैं, अगर आपको लगता सुधार की जरूरत है या मुझे पता है अगर कुछ गलत है करते हैं:

//This is a Function which prints a greeting message based on the category defined in an 'enum' 
func greet(yourName name: String, category: GreetingsCategory) { 
    switch category { 
     case .Person: 
      print("Hello, " + name + " Today is Tuesday") 
     case .Vehicle: 
      print("Hello, " + name + " your Vehicle is a Car") 
    } 
} 

//This is an 'enum' for greetings categories 
enum GreetingsCategory: String { 
    case Person 
    case Vehicle 
} 

//Type: Person 
class Person { 

    //This is a method which acts only on Person type 
    func personGreeting() { 
     greet(yourName: "Santosh", category: .Person) 
    } 
} 

//Type: Vehicle 
class Vehicle { 

    //This is a method which acts only on Vehicle type 
    func vehicleGreeting() { 
     greet(yourName: "Santosh", category: .Vehicle) 
    } 
} 

//Now making use of our Function defined above by calling methods of defferent types. 
let aPerson = Person() 
aPerson.personGreeting() 
//prints : Hello, Santosh Today is Tuesday 

let aVehicle = Vehicle() 
aVehicle.vehicleGreeting() 
//prints: Hello, Santosh your Vehicle is a Car 

//We can also call the above function directly 
greet(yourName: "Santosh", category: .Person) 
संबंधित मुद्दे