2015-05-22 24 views
6

voglio aggiungere una funzione di classe in estensione:Swift: Come aggiungere un metodo di classe in 'String 'estensione

extension String { 
    class func test() { 
    } 
} 

ottengo l'errore: Class methods are only allowed within classes; use 'static' to declare a static method

O come devo chiamare' String.test() "

Ma per NSString

extension NSString { 
    class func aaa() { 
    } 
} 

nessun errore.

se aggiungo statica parola chiave:

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

Got: Expression resolves to an unused function,

Così come dovrei aggiungere una funzione di classe vogliono anche usare self. metodo.

MODIFICA: Questo funziona!

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

ma circa @ risposta di lan:

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

quando si digita appare come questa:

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

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

risposta

6

Class e static funzioni non sono chiamati in un'istanza di una classe/struct , ma sulla classe/struct stessa, quindi non puoi semplicemente aggiungere una stringa ad una classe.

Apple Documentation:

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

È possibile, tuttavia, aggiungere una stringa a un'istanza variabile di un String utilizzando la parola chiave mutating:

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" 

Se si sta tentando di utilizzare un puntatore ad una stringa come parametro, è possibile utilizzare la parola chiave inout per modificare la stringa inserita:

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

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

come dovrei chiamare "String.add()"? –

+0

Su un'istanza di una stringa, non sulla classe stessa. Non ha assolutamente senso chiamare add sul tipo String perché non c'è alcun valore da aggiungere a – Ian

+0

hey @lan, puoi controllare di nuovo la mia domanda? –

Problemi correlati