2015-05-21 9 views
7

Ist es möglich, einen variablen Parameter in Swift optional zu haben? Ich habe versucht, die beiden Wege, die Sinn und weder der Kompilierung gemacht:Wie kann ich in Swift einen Variadic-Parameter (Ellipse) angeben?

func myFunc(queryFormat: String?...) { 

} 

oder

func myFunc(queryFormat: String...?) { 

} 

Hinweis: Die erste Implementierung kompiliert technisch aber wenn Sie versuchen, es auszupacken:

if let queryFormatUnwrapped = queryFormat { 
... 
} 

Sie Erhalte einen Fehler Bound value in a conditional binding must be of Optional Type, der mir anzeigt, dass er es als ein Array von optionalen Strings behandelt, nicht als optionales Array von Strings (was irgendwie albern ist).

+0

Würden Sie einfach überprüfen, ob das Array leer war? – Tobias

+0

@ABakerSmith Wenn ich versuche, 'queryFormat' auszupacken, wird ein Fehler ausgegeben, der darauf hinweist, dass es sich um ein Array von optionalen Strings handelt, nicht um ein optionales Array von Strings. – Shizam

+0

Wie von @Tobias vorgeschlagen, gibt es keine Möglichkeit, das Parameterpaket _entire optional zu machen. Was würde das bedeuten? Der Benutzer kann null oder mehr Argumente liefern, die in einem Array ankommen. Wie/warum sollte dieses Array optional sein? Auf der anderen Seite können die Parameter _themels__ optional sein. –

Antwort

12

Es ist nicht möglich, einen optionalen variadischen Parameter zu haben. Die Funktion erhält immer ein Array für den variablen Parameter.

Das Array kann jedoch leer sein, oder die Werte im Array können null sein.

Ich warf einige Beispielcode zusammen, hoffe, es hilft zu kommunizieren, was ich versuche zu sagen.

func vardicPrint(strings: String...) { 
    if strings.isEmpty { 
     print("EMPTY") 
    } else { 
     for string in strings { 
      print(string) 
     } 
    } 
} 

func optionalPrint(maybeStrings: String?...) { 
    if maybeStrings.isEmpty { 
     print("EMPTY") 
    } else { 
     for string in maybeStrings { 
      if let string = string { 
       print(string) 
      } else { 
       print("nil") 
      } 

     } 
    } 
} 

vardicPrint("Hello", "World", "!") 
vardicPrint() 


var nilString: String? 
optionalPrint("Goodbye", nil, "World", "!") 

/* OUTPUT: 
Hello 
World 
! 
EMPTY 

Goodbye 
nil 
World 
! 
*/