Lỗi này là sai lầm: cốt lõi là bạn đang bỏ lỡ sự trở lại loại ... -> Bool
trong chữ ký chức năng của bạn, vì thế cố gắng gán một giá trị boolean để trống loại tuple ()
(không có kiểu trả về rõ ràng, chức năng hy vọng trả về là loại tuple rỗng ()
).
Bạn có thể tạo lại lỗi gây hiểu lầm này cho bất kỳ nỗ lực nào để gán giá trị boolean cho loại không logic, trong đó giá trị boolean là kết quả của biểu thức logic AND/OR được thực hiện trong cùng một biểu thức như gán không hợp lệ:
var a :() = (true && false) /* same error */
var b : Int = (true && false) /* same error */
var c :() = (true || false) /* same error (for binary op. '||') */
trong khi nếu bạn quấn hoạt động của bạn và/hoặc đóng cửa hoặc đơn giản là giao cho một biến boolean trung gian, bạn mất thông báo lỗi khó hiểu và được trình bày với các lỗi thực tế.
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 '()' */
Bây giờ là tại sao bạn đang đưa ra lỗi sai lệch này. Cả hai toán tử logic &&
và ||
được thực hiện với một đánh giá điều kiện của biểu thức bên tay phải của họ (rhs
), do đó rhs
thể uể oải đánh giá chỉ trong trường hợp phía bên tay trái (lhs
) để đánh giá true
/false
cho &&
/||
nhà khai thác , tương ứng.
/* e.g. the AND '&&' logical binary infix operator */
func &&(lhs: BooleanType, @autoclosure rhs:() -> BooleanType) -> Bool {
return lhs.boolValue ? rhs().boolValue : false
}
Kể từ khi lhs
chính nó là không hợp lệ cho việc giao nhận sau đây, có thể đóng cửa lười biếng rhs
ném một lỗi phát sinh do việc chuyển nhượng không hợp lệ "bên ngoài" từ Bool
loại để ()
, nhưng lỗi ném ("Binary op Không thể áp dụng '&&
' ... ") không phải là nguồn thực sự của sự thất bại của cuộc gọi &&
.
Để xác minh, chúng tôi có thể thực hiện riêng của chúng tôi không lười biếng và nhà điều hành, nói &&&
, và, như mong đợi, chúng tôi không nhận được lỗi xáo trộn cùng:
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 '()' */
Bạn đang thiếu kiểu trả về '... -> Bool' trong chữ ký hàm của bạn. (Lỗi này có phần gây hiểu lầm: nhưng không có kiểu trả về được chỉ định, hàm mong đợi kiểu trả về '()' (tuple trống), trong khi bạn trả về một boolean). – dfri