2015-12-24 13 views
7

In una funzione rapida può avere parametri opzionali che hanno valori di default come:Parametro facoltativo nel caso in cui enum in rapida

func f(a:Int, b:Int?=nil) {} 

f(1); 
f(1,2); 

mi piacerebbe fare questo con valori associati con un enum. A seguito di questo post su type safe url routes, mi piacerebbe avere un percorso che può richiedere un parametro opzionale, come ad esempio:

enum StopPoint { 
    case Search(query:String, limit:Int?=nil) 
} 

Tuttavia si dice che non posso avere un valore predefinito per un parametro in una tupla. Tuttavia è possibile avere un caso come case Arrivals(stopId:Int), ma non è possibile in generale avere una tupla con un parametro con nome.

Quindi è possibile avere un enum con un parametro predefinito ed il valore associato è una tupla o no?

risposta

3

Non penso sia possibile. È semplicemente una bella funzionalità di function s. Nulla di ciò che supporta la vera tupla sottostante. La documentazione per Default Parameter Values Stato:

È possibile definire un valore predefinito per qualsiasi parametro in una funzione assegnando un valore al parametro dopo il tipo del parametro. Se viene definito un valore predefinito, è possibile omettere tale parametro quando si chiama la funzione.

Le enumerazioni semplicemente non hanno questa caratteristica. È necessario utilizzare in modo esplicito un elemento enum diverso per l'inclusione di ulteriori parametri opzionali:

enum StopPoint { 
    case Search(String) 
    case SearchLimit(String, Int) 
} 

enumerazioni sono abbastanza potenti, ma non thaaaat potente. Non è possibile utilizzare i valori di default, è possibile per esempio, non usare un tipo variadic (forse anche di più "restrizioni"):

enum StopPoint { 
    case SearchMult(String...) // causes compile error 
} 

Per quanto riguarda l'potenzialmente interessante del "perché" -question : idea , Non sono così profondamente coinvolto nell'architettura del linguaggio.

1

Forse avete già preso in considerazione questo e scontata è: è possibile avvicinarsi alla convenienza di quello che stai cercando per la creazione di un func statico sul enum:

enum StopPoint { 
    case Search(query:String, limit:Int?) 

    static func createSearch(query:String, limit:Int?=nil) -> StopPoint { 
     return .Search(query: query, limit: limit) 
    } 
} 

let myStopPoint = StopPoint.createSearch("my query") 
4

Che cosa si può fare è:

enum StopPoint { 
    case Search(query: String, limit: Int?) 

    init(query: String, limit: Int? = nil) { 
     self = .Search(query: query, limit: limit) 
    } 
} 

let foo = StopPoint(query: "default")    // Search("default", nil) 
let bar = StopPoint(query: "special", limit: 42) // Search("special", Optional(42)) 
+2

Ci sarebbero altri casi oltre alla ricerca. –

Problemi correlati