2015-12-24 18 views
7

w Swift funkcji może mieć opcjonalne parametry, które mają wartości domyślne, takie jak:Opcjonalny parametr w przypadku enum w szybkim

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

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

Chciałbym to zrobić z wartościami powiązanymi z wyliczenia. W następstwie tego postu o type safe url routes, chciałbym mieć trasę, która może potrwać opcjonalny parametr, takich jak:

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

Jednak mówi, że nie może mieć wartość domyślną dla parametru w krotki. Jednak możliwe jest posiadanie sprawy takiej jak case Arrivals(stopId:Int), jednak ogólnie nie jest możliwe, aby krotka miała jeden nazwany parametr.

Czy jest więc możliwe wyliczenie z parametrem domyślnym, a wartość skojarzona jest krotką, czy nie?

Odpowiedz

3

Nie sądzę, że to możliwe. Jest to po prostu schludna funkcja z function. Nic, co podpiera odpowiednia krotka pod spodem. Dokumenty dla stanu Default Parameter Values stan:

Możesz zdefiniować wartość domyślną dla dowolnego parametru w funkcji, przypisując wartość do parametru po tym typie parametru. Jeśli zdefiniowana jest wartość domyślna, można pominąć ten parametr podczas wywoływania funkcji.

Wylogi po prostu nie mają tej funkcji. Musisz wyraźnie użyć innego elementu wyliczającego, aby uwzględnić opcjonalne dodatkowe parametry:

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

Obliczenia są dość potężne, ale nie mocne. Nie można użyć wartości domyślnych, można na przykład nie używaj typ zmiennej liczbie argumentów (może nawet bardziej „ograniczenia”):

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

chodzi o potencjalnie interesujących „dlaczego” -question : bez pomysłu , Nie jestem tak głęboko zaangażowany w architekturę językową.

1

Być może już za to i dyskontowane go: Można zbliżyć się do wygody, czego szukasz poprzez stworzenie statycznej func na 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

Co można zrobić, to:

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

Będą inne przypadki niż tylko wyszukiwanie. –