2015-05-22 8 views
6

मैं विस्तार में एक वर्ग समारोह जोड़ना चाहते हैं:स्विफ्ट: 'स्ट्रिंग में एक वर्ग विधि कैसे जोड़ें "विस्तार

extension String { 
    class func test() { 
    } 
} 

मैं त्रुटि मिलती है: Class methods are only allowed within classes; use 'static' to declare a static method

या मैं कैसे बुलाना चाहिए" String.test() "

लेकिन के लिए NSString

extension NSString { 
    class func aaa() { 
    } 
} 

कोई त्रुटि नहीं।

मैं जोड़ देते हैं तो स्थिर कीवर्ड:

extension String { 
    static func aaa() { 
     self.stringByAppendingString("Hello") 
    } 
} 

गॉट: Expression resolves to an unused function,

तो मैं कैसे एक वर्ग समारोह जोड़ना चाहिए भी self. विधि का उपयोग करना चाहते हैं।

संपादित करें: यह काम करता है!

extension String { 
    static func aaa (path:String) -> String { 
     return path.stringByAppendingString("Hello") 
    } 
} 

लेकिन के बारे में @ लैन के जवाब:

mutating func bbb(path: String) { 
    self += "world" 
} 

जब मैं इसे इस तरह दिखाई देता है टाइप करें:

String.bbb(&<#String#>) 
String.bbb(&"nihao") 

Cannot invoke 'bbb' with an argument list of type '(String)' 

उत्तर

6

Class और static कार्यों एक वर्ग/struct का एक उदाहरण पर बुलाया नहीं कर रहे हैं , लेकिन कक्षा/संरचना पर ही, तो आप केवल एक वर्ग में एक स्ट्रिंग संलग्न नहीं कर सकते हैं।

Apple Documentation:

extension String { 
    mutating func aaa() { 
     self += "hello" 
    } 
} 

let foo = "a" 
foo.aaa() // Immutable value of type 'String' only has mutating members named 'aaa' 

var bar = "b" 
bar.aaa() // "bhello" 

आप एक के लिए एक सूचक का उपयोग करने की कोशिश कर रहे हैं, तो:

Within the body of a type method, the implicit self property refers to the type itself, rather than an instance of that type.

हालांकि, आप एक स्ट्रिंग एक String के एक चर उदाहरण के लिए mutating कीवर्ड का उपयोग जोड़ सकते हैं एक पैरामीटर के रूप में स्ट्रिंग, आप इनपुट स्ट्रिंग को बदलने के लिए inout कीवर्ड का उपयोग कर सकते हैं:

extension String { 
    static func aaa(inout path: String) { 
     path += "Hello" 
    } 
} 

var foo = "someText" 
String.aaa(&foo) 
foo //someTextHello 
+0

मुझे "String.add()" को कैसे कॉल करना चाहिए? –

+0

स्ट्रिंग के उदाहरण पर, क्लास पर नहीं। यह टाइप स्ट्रिंग पर पूरी तरह से कोई कॉलिंग कॉलिंग नहीं करता है क्योंकि – Ian

+0

हे @lan में शामिल करने के लिए कोई मूल्य नहीं है, क्या आप फिर से मेरे संपादित प्रश्न की जांच कर सकते हैं? –

1

"Within the body of a type method, the implicit self property refers to the type itself, rather than an instance of that type."

इस प्रकार जब आप एक प्रकार विधि आप केवल self के माध्यम से अन्य प्रकार के तरीकों कॉल कर सकते हैं जोड़ने के द्वारा एक प्रकार का विस्तार। यदि आप एक उदाहरण विधि को कॉल करना चाहते हैं तो आपको एक उदाहरण बनाने और उस पर एक विधि कॉल करने की आवश्यकता है।

+0

धन्यवाद, आप मुझे इशारा भी देते हैं। –

संबंधित मुद्दे