Lubię używać straży i natknąłem się na sytuację, w której chcę użyć where
również dla kontroli typu:
guard let status = dictionary.objectForKey("status") as! String! where status is String else { ...}
xCode narzeka poprawnie, że zawsze jest to prawda.
Moim celem jest, aby rozpakowany Sznurek znajdował się za strażnikiem w jednej linii.
Jak mogę to zrobić?
Odpowiedzi:
5 dla odpowiedzi № 1Prawdopodobnie chcesz tego?
guard let status = dictionary["status"] as? String else {
// status does not exist or is not a String
}
// status is a non-optional String
2 dla odpowiedzi nr 2
Kiedy używasz as! String!
mówisz Swift, że ty wiedzieć że obiekt w twoim słowniku musi być String
. Jeśli w czasie wykonywania obiekt nie jest String
, pozwalasz Swiftowi rzucić wyjątek rzucania. Właśnie dlatego where
część twojego czeku nie zawiedzie: albo status
będzie String
, inaczej trafisz na wyjątek przed where
klauzula.
Zamiast tego możesz wykonać opcjonalną obsadę, używając as?
operator zamiast as!
. W połączeniu z guard let
, takie podejście daje
guard let status = dictionary.objectForKey("status") as? String else { ... }
... // If you reached this point, status is of type String, not String?