2010-03-17 66 views
6

Tôi biết rằng javascript, ví dụ hỗ trợ các chức năng bên trong của các chức năng, như vậy:Chức năng của iPhone SDK Objective C có hỗ trợ các chức năng bên trong các chức năng không?

function doSomething(){ 

    function doAnothingThing(){ 
    //this function is redefined every time doSomething() is called and only exists inside doSomething()  
    } 

    //you can also stick it inside of conditions 

    if(yes){ 
    function doSomethingElse(){ 
     //this function only exists if yes is true 
    } 
    } 


} 

Liệu Objective-C hỗ trợ này? Ví dụ lý thuyết:

-(void) doSomething:(id) sender{ 
    -(void) respondToEvent: (id) sender{ 
    //theoretically? ... please? 
    } 
} 

THƯỞNG: Thuật ngữ thích hợp cho hàm "cục bộ" là gì?

+0

Javascript chỉ cho phép điều này bởi vì nó không có các lớp học thật sự. Đó là cách duy nhất để đóng gói các chức năng. – TechZen

Trả lời

8

Thuật ngữ thông thường là chức năng lồng nhau. gcc hỗ trợ các hàm lồng nhau dưới dạng phần mở rộng cho C (bị tắt theo mặc định). Tôi không nghĩ rằng tùy chọn này có sẵn với Objective-C (hoặc C++) với gcc mặc dù, và thậm chí nếu nó đã được nó có thể không phải là một ý tưởng tốt để sử dụng nó (portability vv).

gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

+0

Trong hàm Obj-C được gọi, "Phương pháp" Tôi khá chắc chắn, đó có thể là lý do tại sao anh ta đặt câu hỏi, "Phương pháp lồng nhau" – NpC0mpl3t3

+0

@ NpC0mpl3t3: Tôi không thấy từ "lồng nhau" hoặc "phương pháp" ở bất kỳ đâu câu hỏi của OP? –

7

Theo mặc định Xcode không cho phép chức năng lồng nhau.

Nếu bạn muốn bật chúng, hãy mở Thông tin cho dự án của bạn, đi tới tab Xây dựng và đặt "Cờ C khác" (trong phần có tiêu đề "GCC 4.2 - Ngôn ngữ") thành "-fnested- chức năng".

(Điều này được lưu trữ trong file project.pbxproj của bạn là "OTHER_CFLAGS = '-fnested chức năng';"

+0

+1 để biết hướng dẫn về cách bật – Moshe

+0

Lưu ý rằng điều này chỉ hoạt động đối với C, tôi tin - không phải Mục tiêu-C hoặc C++. –

+1

@Paul bạn có thể lồng một hàm C bên trong một phương thức Objective-C tốt. Bạn không thể lồng một phương thức bên trong một phương thức khác, nhưng điều đó có ý nghĩa. Objective-C là một thời gian chạy rất mỏng trên đỉnh của đồng bằng C (hoặc C++). –

9

Một hơi muộn, nhưng bạn có thể đặt một khối inline vào một chức năng, trong đó loại hành vi như câu hỏi hàm lồng nhau của bạn.

-(int)addNumbers:(int)a withB:(int)b withC:(int)c { 

    // inline block 
    int(^inlineaddNumbers)(int, int) = ^(int a, int b) { 
     return a + b; 
    }; 

    if(a == 0) return inlineaddNumbers(b,c); 
    else return inlineaddNumbers(a,c); 
} 

đó là một chút lộn xộn, nhưng nó hoạt động!

0

@Moshe bạn không thể thực sự cung cấp các chức năng lồng nhau bên trong Objective C. Thay vào đó bạn có thể sử dụng tính năng trong mới nhất Swift 3 mà cho phép tính năng này, như sau:

func someFunction(input:String)->String 
{ 
    var inputString = input; 
    func complexFunctionOnString() 
    { 
     inputString = "Hello" + input; 
    } 
    complexFunctionOnString(); 
    return inputString; 
} 
someFunction("User"); 
1

Mở rộng câu trả lời được cung cấp bởi Gui13 một chút, với thông số đối tượng.

Đoạn mã sau đây minh họa cách vẽ một bộ UILabels 11x5.

// inline block - to be called as a private function 
UILabel *(^createLabel)(CGRect, NSString *, UIColor *) = ^UILabel *(CGRect rect, NSString *txt, UIColor *color) { 
    UILabel *lbl = [UILabel new]; 
    lbl.frame = rect; 
    lbl.textColor = color; 
    lbl.backgroundColor = [UIColor whiteColor]; 
    lbl.font = [UIFont systemFontOfSize:30.f]; 
    lbl.textAlignment = NSTextAlignmentCenter; 
    lbl.text = txt; 
    return lbl; 
}; 
// loop to create 11 rows of 5 columns over the whole screen 
float w = CGRectGetWidth([UIScreen mainScreen].bounds); 
float h = CGRectGetHeight([UIScreen mainScreen].bounds); 
float top = h/10;   //start at 10% from top 
float vOffset = h/13;  //space between rows: 7.6% of screen height 
NSArray *xFrom, *xTo;  //columns to start at 5%, 20%, 40%, 60%, 80% 
xFrom = @[@(1.f/20),  @(1.f/5),  @(2.f/5),  @(3.f/5),  @(4.f/5)]; 
xTo = @[@(1.f/5-1.f/16), @(2.f/5-1.f/16), @(3.f/5-1.f/16), @(4.f/5-1.f/16), @(19.f/20)]; 
#define SFMT(format...) [NSString stringWithFormat:format] 
for (int row=0; row<11; row++) { 
    for (int col=0; col<5; col++) { 
     CGRect rect = CGRectMake([xFrom[col] floatValue]*w, top+row*vOffset, [xTo[col] floatValue]*w-[xFrom[col] floatValue]*w, vOffset*0.9); 
     UILabel *lbl = createLabel(rect, SFMT(@"%i-%i", row, col), [UIColor blueColor]); 
     [<my-view> addSubview:lbl]; 
    } 
} 

Đây là kết quả cho mã này:

code output