2008-11-20 31 views
14

Tôi đang gặp rắc rối với mã này:Làm cách nào để truyền id đến một float?

NSRect itemFrame; 
id item; 
// code to assign item goes here. 
itemFrame.origin.y -= [item respondsToSelector:@selector(selectedHeight)] ? [item selectedHeight] : [self defaultSelectedHeight]; 

Đây là chút vấn đề:

[item selectedHeight] 

Trình biên dịch là giả định rằng các kiểu trả về là id. Mặc dù tôi thêm dàn diễn viên sẽ khắc phục điều này:

(float)[item selectedHeight] 

nhưng không hoạt động.

Tôi đang làm gì sai? (Tôi nghi ngờ vấn đề là phải làm với giải quyết con trỏ liên quan đến id nhưng tôi không thể tìm thấy bất kỳ tài liệu có liên quan).

Trả lời

34

bạn muốn [[item selectedHeight] floatValue], giả sử rằng lựa chọnHeight trả về NSNumber.

1

Bạn cần xem xét khai báo phương thức selectedHeight của mình. Vấn đề là phương thức trả về một con trỏ tới một đối tượng (id) hoặc bạn chưa nhập tệp tiêu đề cho item trong tệp chứa đoạn mã, vì vậy Xcode giả định đó là con trỏ theo mặc định.

Bạn không thể truyền con trỏ tới phao, vì chúng là các loại không tương thích về cơ bản. Một khi bạn nhận được tờ khai của bạn thẳng ra mặc dù bạn sẽ không sao.

1

Trình biên dịch tạo ra loại giả định đó khi nhiều lớp khai báo các phương thức có cùng tên, trả về các kiểu khác nhau. Vì biến "item" của bạn được nhập là "id", trình biên dịch không biết lớp nào trong số các lớp này, nó sẽ gửi thư đến lúc chạy và chọn một.

Để tránh vấn đề này, bạn có thể thông báo cho trình biên dịch những gì lớp "mặt hàng" là một thể hiện của, bằng cách tuyên bố nó với một loại hình cụ thể thay vì chung chung "id":

SomeItemClass *item; 

Bạn cũng có thể tránh nó bằng cách không khai báo các phương thức có tên giống hệt nhau trả về các kiểu khác nhau.

5

Tôi biết rằng mã bên dưới hoạt động cho iOS 6 SDK. Tôi giả định rằng đối tượng obj chứa một giá trị float.

id obj; 
float fVal; 

fVal = [obj floatValue]; 
Các vấn đề liên quan