2010-01-31 42 views
25

Trong một dự án Xcode Tôi có một tập tin C với chức năng, nó biên dịch và hoạt động OKSử dụng C Struct trong Objective C

Tôi muốn quấn mã C của tôi trong struct (s), làm thế nào tôi sẽ có thể gọi chúng trong Objective-C?

+2

@ Jonathan Sterling: Nó làm phiền tôi nữa. Nó cũng làm phiền tôi khi mọi người đề cập đến Xcode hoặc Cocoa như một ngôn ngữ, hoặc Objective-C như một khuôn khổ. – dreamlax

+0

Vâng, điểm tốt. –

+0

BTW, nhờ @Perspx để sửa lỗi này. Bây giờ, hãy bỏ cuộc thảo luận này và trả lời câu hỏi của Paul. :) –

Trả lời

47

chức năng Khai báo con trỏ, thêm chúng vào cấu trúc của bạn và sau đó gọi cho họ, nó chỉ là C.

Ví dụ:

//Typedef 2 function pointers, first takes and returns int, 
// second takes and returns double 
typedef int (*FuncPtrInt) (int); 
typedef double (*FuncPtrDouble)(double); 

// create structure to store function pointers 
struct ABC 
{ 
    FuncPtrInt applyA; 
    FuncPtrDouble applyB; 
}; 

// create some functions to use with structure 
int incrFuncA(int num) { return ++num; } 
double decrFuncB(double num) { return --num; } 
double multiplyFuncB(double num) { return num*num; } 

// try it out 
void testStruct() 
{ 
    struct ABC abc; 
    abc.applyA = incrFuncA; 
    abc.applyB = decrFuncB; 

    NSLog(@"increment: %d",abc.applyA(3)); 
    NSLog(@"decrement: %f",abc.applyB(3.5)); 

    abc.applyB = multiplyFuncB; 

    NSLog(@"multiply: %f",abc.applyB(3.5)); 
} 

Output:

2010-02-01 10:36:22.335 x[11847] increment: 4 
2010-02-01 10:36:22.336 x[11847] decrement: 2.500000 
2010-02-01 10:36:22.336 x[11847] multiply: 12.250000 

Nếu bạn muốn có một cấu trúc với các hàm mà các hàm hoạt động trên cấu trúc, bạn phải vượt qua con trỏ đến chức năng mà theo mặc định (tương tự như những gì C++ không):

Xác định:

struct ClassABC; 
typedef int (*FuncPtrClassABC)(struct ClassABC *); 
typedef int (*FuncPtrClassABCInt)(struct ClassABC *, int); 

int incrFunc(struct ClassABC * abc); 
int decrFunc(struct ClassABC * abc); 
int addFunc(struct ClassABC * abc, int num); 
int subtractFunc(struct ClassABC * abc, int num); 

struct ClassABC 
{ 
    int i; 
    FuncPtrClassABC increment; 
    FuncPtrClassABC decrement; 
    FuncPtrClassABCInt add; 
    FuncPtrClassABCInt subtract; 
}; 

Như bạn có thể thấy các chức năng này có thể được độc lập, bạn sẽ vẫn vượt qua ClassABC trong :

int incrFunc(struct ClassABC * abc) { return ++(abc->i); } 
int decrFunc(struct ClassABC * abc) { return --(abc->i); } 
int addFunc(struct ClassABC * abc, int num) 
{ abc->i += num; return abc->i; } 
int subtractFunc(struct ClassABC * abc, int num) 
{ abc->i -= num; return abc->i; } 

khởi helper func:

void initClassABC(struct ClassABC * abc) 
{ 
    abc->i = 0; 
    abc->increment = incrFunc; 
    abc->decrement = decrFunc; 
    abc->add = addFunc; 
    abc->subtract = subtractFunc; 
} 

Cách sử dụng:

struct ClassABC cabc; 
initClassABC(&cabc); 

cabc.add(&cabc,4); 
NSLog(@"add: %d", cabc.i); 

cabc.decrement(&cabc); 
NSLog(@"decrement: %d", cabc.i); 

cabc.subtract(&cabc,2); 
NSLog(@"subtract: %d", cabc.i); 

Output:

2010-02-01 10:56:39.569 x[12894] add: 4 
2010-02-01 10:56:39.569 x[12894] decrement: 3 
2010-02-01 10:56:39.569 x[12894] subtract: 1 

Thưởng thức

+0

Trong trường hợp thứ hai, các hàm có thể độc lập nhưng bởi vì bạn sau khi gói mã trong các cấu trúc thì đó là một cách để thực hiện nó. – stefanB

+1

Bạn có thể sử dụng target-C++ trong trường hợp đó tôi nghĩ bạn chỉ có thể sử dụng cấu trúc C++ trong đó các phương thức có quyền truy cập vào các biến struct như trong lớp C++/struct. – stefanB

57

Mục tiêu-C là bộ siêu đúng của C. Mọi thứ bạn có thể thực hiện trong C có thể được thực hiện giống hệt nhau trong Mục tiêu-C. Vì vậy, bạn thực sự không cần phải nghĩ về chúng như các ngôn ngữ khác nhau; Mục tiêu-C chỉ đơn giản là "C cộng thêm một số thứ".

// this struct is compatible with C and Obj-C 
struct fruit { 
    int a; 
}; 

int main() 
{ 
    struct fruit apple; 
    apple.a = 1; 

    return 0; 
} 

Sau đó, mọi tệp nguồn C hoặc Mục tiêu-C đều có thể truy cập cấu trúc đó. Không có thêm bất kỳ biến chứng nào được giới thiệu bởi Objective-C.

+1

Câu trả lời hay. (Để rõ ràng, tuy nhiên, bạn không gọi một cấu trúc.) –

+0

Upvote cho ngắn gọn – bloudermilk

+4

+1 cho định nghĩa apt. Lượt thích "C cộng với một số nội dung khác" .. có thể là "C cho Apple" –