Tôi có một chức năng dường như hợp pháp có thể chuyển đổi một mảng đến một từ điển:Swift không thể suy ra loại từ bối cảnh
func arrayToDictionary<Key : Hashable, Value>
(source: Array<Value>, key: Value -> Key) -> Dictionary<Key, Value> {
var dictionary = Dictionary<Key, Value>()
for element in source {
let key = key(element)
dictionary[key] = element
}
return dictionary
}
Bây giờ, khi tôi cố gắng gọi nó là:
let dict = arrayToDictionary([1, 2, 3], { val in return val })
tôi nhận được một lỗi - Không thể chuyển đổi loại biểu thức '($ T6, (($ T9) -> ($ T9) -> $ T8) -> (($ T9) -> $ T8) -> $ T8)' để nhập 'Hashable'
Kỳ lạ, nếu tôi sử dụng trả lại tiềm ẩn:
let dict = arrayToDictionary([1, 2, 3], { val in val })
hoặc viết tắt:
let dict = arrayToDictionary([1, 2, 3], { $0 })
nó hoạt động tốt. Tại sao?
'để dict = arrayToDictionary ([1, 2, 3], {val trong val}) '(lấy ra' return') cũng có vẻ hoạt động tốt. –
Và, ngay cả người lạ, xác định rõ ràng 'val' như một' Int' với 'return' tại chỗ:' let dict = arrayToDictionary ([1, 2, 3], {(val: Int) trong trả về val}) ' gây ra lỗi: ''NSNumber' không phải là một kiểu con của 'Int''. Lấy lại 'return' ra vẫn hoạt động. –
điều này trông giống như một lỗi trình biên dịch cho tôi và tôi khuyên bạn nên báo cáo nó. Một số tối ưu hóa diễn ra đằng sau hậu trường được thực hiện quá sớm và kiểm tra kiểu không hài lòng về nó –