2016-07-19 18 views
24

Đó phải là một sai lầm cơ bản, nhưng tôi không thể nhìn thấy những gì là sai trong mã này:tham khảo mơ hồ thành viên '=='

.... object is some NSManagedObject .... 
let eltType = ((object.valueForKey("type")! as! Int) == 0) ? .Zero : .NotZero 

Tại thời gian biên dịch, tôi nhận được tin nhắn này:

Ambiguous reference to member '==' 

So sánh số Int với 0 dường như không rõ ràng đối với tôi, vì vậy tôi đang thiếu gì?

Trả lời

41

Các thông báo lỗi là sai lầm. Vấn đề là trình biên dịch có không có thông tin gì loại giá trị .Zero, .NotZero tham chiếu.

vấn đề này cũng không liên quan đến đối tượng được quản lý hoặc valueForKey phương pháp, bạn sẽ nhận được thông báo lỗi tương tự cho

func foo(value: Int) { 
    let eltType = value == 0 ? .Zero : .NotZero // Ambiguous reference to member '==' 
    // ... 
} 

Vấn đề có thể được giải quyết bằng cách xác định một giá trị gõ đầy đủ

let eltType = value == 0 ? MyEnum.Zero : .NotZero 

hoặc bằng cách cung cấp ngữ cảnh mà trình biên dịch có thể suy ra loại:

let eltType: MyEnum = value == 0 ? .Zero : .NotZero 
+1

Đúng là bằng cách thêm loại nó hoạt động. Nhưng nếu thay vì sử dụng toán tử bậc ba tôi sử dụng biểu mẫu if() {...} else {...} thì nó hoạt động mà không có kiểu. Tôi không thấy sự khác biệt. Các thông tin tại xử lý của trình biên dịch cho loại inferring có vẻ là như nhau. – Michel

+0

@Michel: Chính xác câu lệnh if/else hoạt động mà không có kiểu là gì? –

+0

Nhìn lại những gì tôi đã làm, tôi có thể đã đưa ra loại tại một số điểm, khi khai báo biến. Làm những gì bạn viết đúng. – Michel

0

Tháo vòng tay dường như công trình:

let eltType = (object.valueForKey("type")! as! Int) == 0 ? .Zero : .NotZero

+0

Loại bỏ các dấu ngoặc đơn không tạo ra bất kỳ sự khác biệt nào đối với tôi. – Michel

Các vấn đề liên quan