मेरे लिए, मैं static
या class
तरीकों का उपयोग या वर्ग के स्तर का गुण नियंत्रित करने के लिए मुझे लगता है कि विशेष रूप से class
या sturct
के कस्टमाइज़ किए गए उदाहरणों वापस जाने के लिए है। उदाहरण के लिए मुझे लगता है कि मेरे पास struct
से नीचे है।
struct Person {
let firstName: String
let lastName: String
}
अब अगर मैं कुछ परीक्षण मामलों, जहां मैं Person
के उदाहरण अपने परीक्षण कक्षाओं के कई में एक विशेष नाम John
साथ प्रारंभ की जरूरत है लिख रहा हूँ, मैं एक सहायक static
विधि बना सकते हैं।
extension Person {
static func john() -> Person {
return Person(firstName: "John", lastName: "Appleseed")
}
}
let john = Person.john() // I could also create a static property instead, but its a matter of personal choice and situation.
ऊपर मामले में, मैं भी वैश्विक समारोह के रूप में john
कर सकता था लेकिन मेरे लिए, यह बहुत अस्पष्ट है और पठनीय नहीं होगा।
एक और जगह मैं सोच सकता हूं कि जहां मैं स्थैतिक विधि पसंद करता हूं, enum
के मामलों की गिनती वापस कर रहा है।
enum Mood {
case happy
case angry
case lazy
case high
static func count() -> Int {
return 4
}
}
ऐसे स्थान हैं, जहां मैं वैश्विक कार्यों का उपयोग करता हूं। मैं लॉगिंग के लिए वैश्विक कार्यों का उपयोग करता हूं।
func log(screenEvent name: String) {
let tracker = GAI.sharedInstance().defaultTracker
tracker.set(kGAIScreenName, value: screenName)
let builder = GAIDictionaryBuilder.createScreenView()
tracker.send(builder.build() as [NSObject : AnyObject])
}
आंतरिक रूप से, विधि एक sharedInstance
उपयोग कर रहा है, एक वैश्विक विधि बनाने यह आसानी से सिर्फ एक print
समारोह जो कंसोल में उत्पादन लॉग की तरह इस परियोजना में हर जगह सुलभ बना देता है, लेकिन यह कुछ कस्टम सेवा में प्रवेश करने के है।
कुछ अन्य वैश्विक कार्य जिन्हें मैं आमतौर पर अपनी परियोजनाओं में शामिल करता हूं वे जीसीडी सहायक हैं।
func delay(delay:Double, closure: dispatch_block_t) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
func backgroundTask(closure: dispatch_block_t) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), closure)
}
func mainThreadTask(closure: dispatch_block_t) {
dispatch_async(dispatch_get_main_queue(), closure)
}
इन कार्यों को कक्षा के बारे में किसी भी जानकारी की आवश्यकता नहीं है, इसलिए उन्हें कक्षा के अंदर लपेटने के बजाय उन्हें वैश्विक बनाने के लिए समझ में आता है।
instance
विधियों के बारे में, जैसा कि @ डंकन सी द्वारा उत्तर दिया गया है, जब आप एक राज्य को बनाए रखना चाहते हैं तो उन्हें उदाहरणों पर बुलाया जाता है। उदाहरण के नीचे स्थिर और आवृत्ति विधियों दोनों का उपयोग दिखाता है।
enum TapType {
case water
case beer
}
struct Tap {
let tapType: TapType
//static method
static func unlimitedBeer() -> Tap {
let beer = Tap(tapType: .beer)
beer.turnOn(forDuration: Float.greatestFiniteMagnitude)
return beer
}
//instance method: will do operation on a particular instance of `Tap`.
func turnOn(forDuration duration: Float) {
//implementation
}
}
let unlimitedBeer = Tap.unlimitedBeer()
तुम हमेशा कस्टम व्यवहार के साथ एक वस्तु initilise को convenience
initiliser उपयोग कर सकते हैं, लेकिन फिर से, पसंद का अपना एक मामले। उपरोक्त उदाहरण में, मैं convenience
initlialiser के बारे में नहीं सोच सकता था जो मुझे असीमित बियर देगा।
जब तक कि स्थानीय एमवीसी में फिनक नहीं है, मुझे कक्षाएं पसंद हैं क्योंकि आप जानते हैं कि वे कहां से आते हैं। किसी और के कोड को डीबग करने का प्रयास करें जहां यह मैशप है और आपके पास कोई सुराग नहीं है। –