2016-03-20 8 views
0

Hallo, gibt es irgendeine Änderung zu schreiben statische Erweiterung in Swift wie in C# ist? Ich meine in C# kann ich gleiche Sache wie folgt schreiben:schnelle statische Erweiterung wie C#

public static class MyExtensions 
{ 
    public static int WordCount(this String str) 
    { 
     return str.Split(new char[] { ' ', '.', '?' }, 
         StringSplitOptions.RemoveEmptyEntries).Length; 
    } 
} 

und nennen Sie es wie folgt aus:

var s = ""; var x = s.WordCount(); 

Ich weiß, dass ich in swift gleiche Sache tun, aber es nur auf Klassentypen arbeiten.

var str:String? 
let s = String.IsNilOrEmpty(str) 

für diese Erweiterung: Auf statischen Typen muss ich so etwas wie schreiben

extension String { 
    static func isNilOrEmpty(str: String?) -> Bool{ 

     if str == nil { 
      return true 
     } 

     if str!.isEmpty{ 
      return true 
     } 

     return false 
    } 
} 

Gibt es ändern Sie es so nennen:

let s = str.IsNilOrEmpty() 

Vielen Dank für Hilfe oder treten heraus richtiger Weg.

+0

Das Problem ist, dass 'str' optional ist, Sie müssten also eine Erweiterung zu Optional definieren. –

+0

Sie könnten dies einfach in einen Spielplatz fallen lassen, um zu sehen, ob es funktioniert. – ryantxr

+0

Ich habe es in Playground versucht, aber mit diesem Ergebnis. Wenn ich eine statische Erweiterung verwende, kann ich diese Erweiterung auf einen optionalen Typ mit diesem Stil aufrufen: let some = String.isNilOrEmpty (someOptional) 'oder mit statischem remove kann ich' let some = someOptionalString.IsNilOrEmpty() 'tun. Aber ich suche nach einer Option, rufe sie in beiden Situationen auf dieselbe Weise auf (wie in meinem zweiten Beispiel). Wenn es diese Option gibt. –

Antwort

0

Sie können Funktionen mit demselben Namen definieren, eine statische, eine nicht statische.

extension String { 
    static func myfunc() -> String { 
     return "static" 
    } 
    func myfunc() -> String { 
     return "func" 
    } 
} 

let s3 = "" 
print(s3.myfunc()) // output = "func" 
print(String.myfunc()) // output = "static" 

In diesem Fall, wenn ‚someOptionalString‘ Null ist, dann wird es die Funktion nicht aufrufen.

let some = someOptionalString.IsNilOrEmpty() 
+0

Danke, jetzt weiß ich, dass ich statische Erweiterung auf nicht initialisierten Typ nicht aufrufen kann. –