Kiedy mówisz:
Moje rozumienie opcjonalnym łańcuchowych jest, że gdy zaczniesz używać ?.
w przerywaną wypowiedzi, reszta właściwości są opcjonalne i są zazwyczaj dostępne przez ?.
, nie .
.
Powiedziałbym, że już prawie jesteś.
Nie wszystkie właściwości są opcjonalne, ponieważ oryginalne połączenie jest opcjonalne, więc wygląda na to, że inne właściwości są opcjonalne.
characters
nie jest właściwością opcjonalną, ani nie jest count
, ale wartość, do której ją wywołujesz, jest opcjonalna. Jeśli istnieje wartość, właściwości characters
i count
zwrócą wartość; w przeciwnym razie zwracana jest nazwa nil
. Z tego powodu wynik s?.characters.count
zwraca wartość Int?
.
Jeśli którakolwiek z właściwości była opcjonalna, musisz dodać do niej ?
, ale w twoim przypadku tak nie jest. A więc nie.
Zmieniano następujący komentarz
Z komentarza:
I jeszcze znaleźć to dziwne, że zarówno s?.characters.count
i (s?.characters)?.count
kompilacji, ale (s?.characters).count
nie. Dlaczego występuje różnica między pierwszym a ostatnim wyrażeniem?
Spróbuję odpowiedzieć na to tutaj, gdzie jest więcej miejsca niż w polu komentarza:
s?.characters.count
Jeśli s
jest zerowa, całe wyrażenie zwraca nil
, w przeciwnym razie Int
. Tak więc typem zwrotu jest Int?
.
(s?.characters).count // Won’t compile
Złamanie tego dół: jeśli s
jest nil
, następnie (s?.characters)
jest nil
, więc nie możemy nazwać count
na nim.
W celu wywołania właściwości count
na (s?.characters)
wyrażenie musi być opcjonalnie odwinął, czyli zapisać jako:
(s?.characters)?.count
Edited by dodać dalsze
najlepiej jak potrafię wyjaśnienie tego jest z tym trochę kodu zabawowego:
let s: String? = "hello"
s?.characters.count
(s?.characters)?.count
(s)?.characters.count
((s)?.characters)?.count
// s?.characters.count
func method1(s: String?) -> Int? {
guard let s = s else { return nil }
return s.characters.count
}
// (s?.characters).count
func method2(s: String?) -> Int? {
guard let c = s?.characters else { return nil }
return c.count
}
method1(s)
method2(s)
Zarówno 's? .characters.count', jak i' (s? .characters)? Count' kompilują się, ale '(s? .characters) .count' does not. Wygląda na to, że 'characters.count' jest traktowany jak pojedyncze opcjonalne połączenie w pierwszym przypadku, ale nie widziałem tego udokumentowanego. –
Omówiono również teraz na temat [szybkich użytkowników]: https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160801/002764.html. –