Błąd jest mylące: rdzeń jest to, że tracisz typ zwracany ... -> Bool
w podpisie funkcji, stąd próby przypisać wartość logiczną do pustego krotki typu ()
(bez wyraźnej typ zwracany funkcja oczekuje powraca, by być pustym typem krotki: ()
).
Ten błędny błąd można odtworzyć dla każdej próby przypisania wartości logicznej do typu nie-boolowskiego, gdzie wartość logiczna jest wynikiem logicznego wyrażenia AND/OR wykonywanego w tym samym wyrażeniu, co niepoprawne przypisanie:
var a :() = (true && false) /* same error */
var b : Int = (true && false) /* same error */
var c :() = (true || false) /* same error (for binary op. '||') */
Zważywszy jeśli owinąć i/lub operacje w zamknięciu lub po prostu przypisać je do pośredniej zmiennej logicznej, tracisz pogmatwanego komunikat o błędzie i jest przedstawiona z rzeczywistego błędu.
var d :() = { _ -> Bool in return (true && false) }()
/* Cannot convert call result type 'Bool' to expected type '()' */
var e = true && false
var f :() = e
/* Cannot convert value of type 'Bool' to expected type '()' */
Teraz dlaczego dostaniemy ten mylący błąd. Oba operatory logiczne &&
i ||
są realizowane z warunkowym oceny ich odpowiednich wyrażeń stronie (rhs
), tak że rhs
można leniwie oceniana tylko w przypadku, gdy po lewej stronie (lhs
) ocenia się true
/false
dla &&
/||
operatorów , odpowiednio.
/* e.g. the AND '&&' logical binary infix operator */
func &&(lhs: BooleanType, @autoclosure rhs:() -> BooleanType) -> Bool {
return lhs.boolValue ? rhs().boolValue : false
}
Ponieważ sama lhs
jest nieprawidłowy dla zadania, które następuje, ewentualnie leniwy zamknięcie rhs
zgłasza błąd poniesionych przez „zewnętrzne” Nieprawidłowe przypisanie z Bool
typu do ()
, ale błąd rzucony („Binary op "&&
" nie można zastosować ... ") nie jest faktycznym źródłem niepowodzenia połączenia &&
.
Aby sprawdzić, możemy realizować nasze własne non-leniwy i operator, powiedzmy &&&
i, zgodnie z oczekiwaniami, nie otrzymamy ten sam błąd zaciemniać:
infix operator &&& {
associativity right
precedence 120
}
func &&&(lhs: BooleanType, rhs: BooleanType) -> Bool {
return lhs.boolValue ? rhs.boolValue : false
}
var g :() = false &&& true
/* Cannot convert value of type 'Bool' to expected type '()' */
Brakuje typu zwrotu '... -> Bool' w sygnaturze funkcji. (Błąd jest nieco mylący: ale bez określonego typu zwracanego, funkcja oczekuje typu zwrotnego '()' (pusta krotka), podczas gdy zwracasz wartość logiczną). – dfri