Istnieje kilka rzeczy się tu dzieje.
1) Urządzenie ?
w d["title"]?
nie jest prawidłowym użyciem. Jeśli próbujesz rozwinąć d["title"]
, użyj numeru !
, ale zachowaj ostrożność, ponieważ spowoduje to awarię, jeśli title
nie jest prawidłowym kluczem w słowniku. (?
jest używany do opcjonalnego łączenia, jak gdybyś próbował wywołać metodę na opcjonalnej zmiennej lub uzyskać dostęp do właściwości.W takim przypadku dostęp nie zrobiłby nic, gdyby opcjonalne były nil
). Wygląda na to, że nie próbujesz rozwinąć d["title"]
, więc zostaw sobie ?
. Dostęp do słownika zawsze zwraca wartość opcjonalną, ponieważ klucz może nie istnieć.
2) Jeśli było ustalić, że:
let maybeTitle = d["title"] as? String
Komunikat o błędzie zmienia się na: błędu: '(String, AnyObject)' nie jest zamienny do 'string'
Problem tutaj jest to, że String
nie jest obiektem. Musisz rzucić na numer NSString
.
let maybeTitle = d["title"] as? NSString
To spowoduje maybeTitle
bycia NSString?
. Jeśli d["title"]
nie istnieje lub typ faktycznie jest NSNumber
zamiast NSString
, opcjonalne będzie miało wartość nil
, ale aplikacja nie ulegnie awarii.
3) Twoja wypowiedź:
let title = maybeTitle as? String
nie rozpakować opcjonalną zmienną, jak chcesz. Poprawna forma to:
if let title = maybeTitle as? String {
// title is unwrapped and now has type String
}
więc oddanie że wszyscy razem:
if let title = d["title"] as? NSString {
// If we get here we know "title" is a valid key in the dictionary, and
// we got the type right. title has now been unwrapped and is ready to use
}
title
będzie miał typ NSString
co jest co jest zapisane w słowniku, ponieważ posiada ona przedmioty. Można zrobić prawie wszystko z NSString
, że można zrobić z String
, ale jeśli trzeba title
być String
można to zrobić:
if var title:String = d["title"] as? NSString {
title += " by Poe"
}
i jeśli słownik zawiera NSNumber
s, a także:
if var age:Int = d["age"] as? NSNumber {
age += 1
}
'd [" title "]' jest opcjonalne, używasz '?' Po opcjonalnym błędzie. Przypadkiem użycia dla tego operatora będzie "object? .property", więc będzie on oceniał tylko 'object.property', gdy' object' ma wartość ** not ** 'nil', inaczej zwraca' nil' – Binarian