2012-01-23 16 views
5

Tôi là một người mới bắt đầu với iPhone dev trong Objective C và có một điều tôi thấy tôi đang làm khá nhiều càng nổi (và ints) trong và ngoài NSArrays khác nhauCó cách viết tắt để có được một phao từ một mảng?

float myFloatValue = [(NSNumber *)[myArray objectAtIndex:integerSelector] floatValue]; 

Tôi hiểu rằng tôi cần để làm điều này boxing vì một float (hoặc int) không phải là một con trỏ và NSArray chỉ chấp nhận con trỏ.

Tôi chỉ tự hỏi nếu có một chút đường cú pháp để rút ngắn dòng mã này - chủ yếu là vì khi tôi có một vài mảng và tôi lặp lại chúng để thực hiện một số xử lý, tôi thấy rằng các dòng bắt đầu nhận được lớn và tôi phải phá vỡ các dòng mà trích xuất các mẫu số các mảng chỉ để làm cho mã có thể đọc được - sau đó tôi có rất nhiều dòng gumph có xu hướng làm cho logic khó làm theo.

Trong một ngôn ngữ như C# Tôi sẽ viết một cái gì đó giống như

float myResult = myArray[i] + someOtherArray[i+1]; 

(ok - đó có thể là một dòng khá ngớ ngẩn của mã - nhưng cú pháp nó khá sạch sẽ, tôi đoán vì .net đang làm boxing ngầm nơi tôi không thể nhìn thấy nó)

trong CI khách quan thấy mình viết:

float myFloatValue = [(NSNumber *)[myArray objectAtIndex:i] floatValue]; 
float myOtherFloatValue = [(NSNumber *)[someOtherArray objectAtIndex:i+1] floatValue]; 

float myResult = myFloatValue + myOtherFloatValue; 

tôi chỉ tự hỏi nếu tôi bỏ lỡ một trick ở đây bằng cách gõ nó tất cả ra longhand. Tôi có nên sử dụng một giải pháp thay thế cho NSArray không? Có lối tắt cho boxing/unboxing không?

Hoặc tôi đoán, nên tôi chỉ quen với nó và dừng whinging;)

+0

Không, mục tiêu-C hút. Nhưng bạn có thể sử dụng một mảng C nếu bạn chỉ lưu trữ phao. Vấn đề với mảng C là phân bổ bộ nhớ động. – vakio

+0

Vâng, ít nhất, tại sao bạn lại đúc? Đây không phải là C++. Bạn có thể gửi bất kỳ thông điệp nào bạn muốn cho một đối tượng 'id'. – StilesCrisis

Trả lời

6

Bạn có thể tạo ra một thể loại:

@class NSArray (FloatHelper) 

- (float) floatAtIndex:(NSUInteger)i; 

@end 

@implementation NSArray (FloatHelper) 

- (float) floatAtIndex:(NSUInteger)i { 
    return [[self objectAtIndex:i] floatValue]; 
} 

@end 

(chưa được kiểm tra và không có xử lý lỗi, trong đó, rõ ràng, không phải là một ý tưởng tốt.)

Sau đó, nó có thể được sử dụng như sau:

float a = [array floatAtIndex:1]; 
+0

+1 Tuyệt vời! Tôi đã không nghĩ về nó trong khi trả lời ;-) – EmptyStack

+0

@Stephen: Tôi không chắc chắn những gì đang xảy ra trong mã bạn đăng ở đây - ví dụ, nơi nào myArray đến từ trong trường hợp này? Ngoài ra, chỉ những thứ cơ bản như - nơi đặt những tờ khai này. Tôi là người mới bắt đầu với mục tiêu C và không có đủ ngữ cảnh ở đây, tôi không cho rằng bạn có liên kết đến hướng dẫn hoặc tài liệu giúp tôi hiểu câu trả lời của bạn tốt hơn một chút? –

+1

Xin lỗi, 'myarray' là lỗi cắt và dán. Nó phải là tự. Xem tại đây để biết tài liệu: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html –

0

Tại sao bạn không tạo một macro,

#define _floatValue(array, index) [(NSNumber *)[array objectAtIndex:index] floatValue] 

sử dụng nó,

float myFloatValue = _floatValue(myArray, i); 
float myOtherFloatValue = _floatValue(someOtherArray, i+1); 
float myResult = myFloatValue + myOtherFloatValue; 

và chỉ ngừng tự mình làm phiền?

+0

Ai là anh chàng buồn cười xuống bình chọn câu trả lời của tôi! Tại sao bỏ phiếu xuống? Câu trả lời của tôi thực sự là một ý tưởng độc hại! Tôi không nghĩ vậy! – EmptyStack

2

Tôi không nghĩ có bất kỳ viết tắt cho rằng, bằng cách này

float myFloatValue = [[myArray objectAtIndex:i] floatValue]; 

là hợp pháp.

1

Bạn có thể tạo danh mục, hàm hoặc macro để thực hiện việc này với mã ít tiết hơn.Nhưng nếu bạn đang làm điều này trong một vòng lặp tiêu thụ thời gian CPU đáng kể (được xác định bằng cách định hình bằng dụng cụ), bạn nên xem xét sử dụng một mảng C thay vào đó, có thể được truy cập bằng cách sử dụng ít chu kỳ CPU hơn, do đó bảo tồn người dùng tuổi thọ pin. Nếu bạn đang chạm vào các phần tử giống nhau nhiều lần, nó thậm chí có thể là một tối ưu hóa để sao chép tất cả các phao này từ một NSArray sang một mảng thuần của các float trước khi thực hiện vòng lặp tính toán của bạn.