Chỉ cố gắng xử lý các khối. Tôi có khái niệm. Chúng giống như các con trỏ hàm, nhưng chúng thực sự là các đối tượng; bạn có thể khai báo một biến khối và gán cho nó một giá trị khối; gọi nó như một hàm; chúng bị "đóng băng trong thời gian", vì thiếu một thuật ngữ, khi chúng được thực hiện, vv Tôi đã tạo ra một vài khối và chạy chúng thành công, trong một vài định dạng khác nhau, nhưng khi nói đến việc sử dụng chúng trong một phương thức - dù bằng typedef hay không - Tôi gặp rất nhiều rắc rối. Ví dụ, đây là một giao diện đối tượng tôi tạo ra, chỉ để có được một xử lý trên cú pháp. Tôi gần như không có ý tưởng làm thế nào để thực hiện nó.Mục tiêu-C: typedef'd một khối, sử dụng nó trong một tuyên bố phương pháp. Làm thế nào để tôi thực hiện điều này?
// AnObject.h
#import <Foundation/Foundation.h>
// The idea with the block and the method below is for the block to take
// an int, multiply it by 3, and return a "tripled" int. The method
// will then repeat: this process however many times the user wants via
// the howManyTimes parameter and return that value in the form of an int.
typedef int (^triple)(int);
@interface AnObject : NSObject
{
int num;
}
-(int)repeat:(int)howManyTimes withBlock:(triple)someBlock;
@end
Dưới đây là những gì tôi có cho một thực hiện, cho đến nay:
#import "AnObject.h"
@implementation AnObject
@synthesize num;
-(int)repeat:(int)howManyTimes withBlock:(triple)someBlock {
for (int i = 0; i <= howManyTimes; i++) {
// What the heck am I supposed to put here? I'm baffled by the
// syntax over and over again.
}
}
@end
tôi biết tôi không giải quyết các biến dụ được nêu ra. Một lần nữa, đây là một bản thảo thô, chỉ cố gắng để có được một xử lý về cách khối làm việc. Tôi thậm chí còn tuyên bố phương pháp này đúng không? Tôi đang đọc Lập trình Mục tiêu-C của trang trại Big Nerd, bài viết của Mike Clark về các khối từ Pragmatic Studio và một vài chủ đề SO. Không thể tìm thấy bất cứ điều gì có liên quan. Cảm ơn.
EDIT: XCode 4.3.2, nếu nó quan trọng.
THÊM CHỈNH SỬA: Ok. Sử dụng (sửa đổi đôi chút) ví dụ BJ, tôi nghĩ rằng tôi đã tìm ra một cách thực sự phức tạp của nhân 5 bằng 3. :)
// BJ's implementation:
-(int)repeat:(int)howManyTimes withBlock:(Triple)someBlock {
int blockReturnValue;
for (int i = 0; i <= howManyTimes; i++) {
blockReturnValue = someBlock(i);
}
return blockReturnValue;
}
chính:
...
@autoreleasepool
{
AnObject *obj = [[AnObject alloc] init];
NSLog(@"%d", [obj repeat: 5 withBlock:^(int number) {
return number * 3;
}]);
}
return 0;
...
Và kết quả là:
15
Bây giờ, nó khởi động lại 15, vì khối tôi đã xác định làm đối số chỉ chạy một lần, phải không? Nó nhân "số", là 5 trong trường hợp này, bằng 3 và đóng băng câu trả lời đó, đúng không? Tôi chắc rằng tôi vừa tạo ra một phương pháp hoàn toàn vô dụng và tôi chưa hiểu cách sử dụng các lợi ích/tính năng của một khối. Tôi có đúng không?
/* ** * ** * ** * ** * ** * ** * ** CẬP NHẬT ** * ** * ** * ** * ** * ** * ** */
UPDATE: Tôi hiểu những gì bạn đang nói, CRD. Mặc dù vậy, chỉ cần một sự điều chỉnh, đối với bất kỳ lập trình viên mới nào có thể đọc được điều này, nhận được một đầu ra khác và đi, "Quế?" cho vòng lặp của bạn nên là một trong hai:
for (int i = 0; i < howManyTimes; i++)
value = someBlock(value);
... hoặc ...
(i = 1; i <= howManyTimes; i++)
... để có được những câu trả lời 243.
Và, vâng, đây chính xác là những gì tôi ban đầu đang cố gắng thực hiện với mã này. Ít nhất đó là những gì tôi nghĩ là đáng lẽ phải xảy ra. Hóa ra ý định của tác giả không phải là gấp ba số, lưu trữ giá trị đó, gấp ba giá trị được lưu trữ, lưu trữ ... vv mà chỉ để in x * 3 cho số 1-5 (3, 6, 9, 12, 15).
Đây là sản phẩm đã hoàn thành. Tôi chỉ cần gõ một khối mà có một int và trả về một int, được gọi là Tripler. Tôi cũng thay đổi tên của đối số từ "someBlock" thành "triple" để cho biết rõ hơn mục đích sử dụng của khối. Tôi nghĩ đó là những thay đổi duy nhất đối với mã.
/******************** interface ********************/
#import <Foundation/Foundation.h>
typedef int (^Tripler)(int);
@interface AnObject : NSObject
-(void)iterateFromOneTo:(int)number withBlock:(Tripler)triple;
@end
/******************** implementation ********************/
#import "AnObject.h"
@implementation AnObject
-(void)iterateFromOneTo:(int)number withBlock:(Tripler)triple {
for (int i = 1; i <= number; i++) {
NSLog(@"%d", triple(i));
}
}
@end
/******************** main.m ********************/
#import "AnObject.h"
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool
{
AnObject *obj = [[AnObject alloc] init];
[obj iterateFromOneTo:5 withBlock:^(int number) {
return number * 3;
}];
}
return 0;
}
Như bạn có thể tưởng tượng, kết quả đầu ra là:
2012-05-05 17:10:13.418 Untitled 2[71735:707] 3
2012-05-05 17:10:13.445 Untitled 2[71735:707] 6
2012-05-05 17:10:13.446 Untitled 2[71735:707] 9
2012-05-05 17:10:13.446 Untitled 2[71735:707] 12
2012-05-05 17:10:13.447 Untitled 2[71735:707] 15
tôi đã làm cho nó rất nhiều phức tạp hơn nó cần thiết để được. Xin lỗi vì đã giải thích nó quá kém trong OP. Cảm ơn bạn đã giúp đỡ!/chủ đề? :)
Đi qua khối giải thích này ... http://www.highoncoding.com/Articles/852_Introduction_to_Objective_C_Blocks.aspx – shankar