2015-11-13 12 views
11

Próbuję utworzyć inicjator failable dla klasy. Moja klasa zostanie zainicjowana przy użyciu danych wejściowych z żądania sieciowego. Sieci, które są niewiarygodne, chcę utworzyć inicjalizator kontroli pod kątem obecności we wszystkich właściwościach, a także w przeciwnym wypadku.Niejednoznaczne odwołanie do elementu 'subscript' w słowniku

Próbuję skorzystać z osłoną tutaj, więc prosimy wskazać żadnych oczywistych błędów w podejściu:

public class JobModel { 
    let jobId: String 
    let status: String 
    let toName: String 
    let toAddress: String 
    let description: String 
    let fee: Int 
    let jobDate: NSDate 
    let fromName: String 
    let fromAddress: String 

    init?(job: [String:AnyObject]) throws { 
     guard self.jobId = job["jobid"] as! String else { 
      throw InitializationError.MissingJobId 
     } 

    } 
} 

Linia guard self.jobId się niepowodzeniem do kompilowania, z błędem: Ambiguous reference to member 'subscript'

Jakieś pomysły na poprawienie tego błędu?

+0

Chcesz fail * * (czyli powrotu '* zerowe) lub rzut * błąd, jeśli właściwość nie jest obecna? To dwie różne rzeczy. –

+1

Komunikat o błędzie wydaje się wprowadzać w błąd: wyrażenie po instrukcji 'guard' musi mieć wynik boolowski lub wynik oceny opcjonalnego powiązania (składnia' let'). Rozważ weryfikację słownika wejściowego * przed * wywoływaniem inicjalizatora. – vadian

+0

@MartinR, Wolałbym rzucić błąd, ponieważ wywołujący inicjatora będzie wiedział, dlaczego inicjalizacja się nie powiodła, kontekst, którego wywołujący nie uzyska, zwracając zero. –

Odpowiedz

8

guard wymaga warunku zgodnego z BooleanType. Proste zadanie nie. Potrzebowałbyś czegoś takiego.

guard let j = job["jobid"] as? String else { 
    throw InitializationError.MissingJobId 
} 
self.jobId = j 

Jednak wtedy dostaniesz błąd „wszystkie zapisane właściwości instancji klasy musi być zainicjowana przed wyrzuceniem z inicjatora”. Jest to normalne i udokumentowane w Swift Język programowania:

For classes, however, a failable initializer can trigger an initialization failure only after all stored properties introduced by that class have been set to an initial value and any initializer delegation has taken place.

Chris Lattner wspomina obecny zachowanie jest niepożądane tutaj: http://swift-language.2336117.n4.nabble.com/Swift-2-throwing-in-initializers-td439.html

Powiązane problemy