2012-07-04 63 views
5

Tôi không biết chính xác cách đặt câu hỏi này. Tôi muốn tạo phương thức như stringWithFormat: hoặc predicateWithFormat:, tức là phương pháp của tôi chấp nhận đối số trực tiếp dưới dạng một chuỗi có định dạng thông số định dạng. Làm thế nào tôi có thể đạt được điều này?Cách tạo phương thức chấp nhận chuỗi có định dạng trực tiếp dưới dạng đối số?

Ví dụ:

-(void) someMethod: (NSString *)str, format; 

Vì vậy mà tôi sau này có thể gọi nó là thích:

[someObject someMethod:@"String with format %@",anotherString]; 

Đây không phải là liên quan đến bất kỳ bối cảnh cụ thể.

Tôi đã làm việc predicateWithFormat với một mã số tương tự như:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like myName"]; 

này không hiệu quả, nhưng:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like 'myName'"]; 

làm việc tương tự như:

NSString *str = @"myName"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",str]; 

Vì vậy, đây có nghĩa là phương pháp có thể hiểu được nếu đối số được đưa ra có định dạng thông số cho chúng tôi ed bên trong chúng. Tôi tò mò làm thế nào điều này có thể được thực hiện?

Trả lời

4

Bạn đang tìm kiếm các phương pháp có số tham số thay đổi. Các phương thức cần được khai báo như sau:

-(void) someMethod: (NSString *)str, ...; // Yes, three dots 

Bên trong phương pháp bạn sử dụng macro để trích xuất từng thông số. Tham số đầu tiên cần cung cấp đủ thông tin để cho biết có bao nhiêu thông số khác được chuyển. Ví dụ: stringWithFormat có thể cho biết có bao nhiêu thông số được chuyển bằng cách tính các số không định dạng % định dạng không thoát.

- (void) someMethod:NSString *)str, ... { 
    va_list args; 
    va_start(args, str); 
    int some_count = /* figure out how many args there are */; 
    for(int i = 0; i < some_count; i++) { 
     value = va_arg(args, <some_type>); // You need to derive the type from the format as well 
    } 
    va_end(args); 
} 
10

Sử dụng các macro varargs va_start, va_end, vv:

-(void) someMethod: (NSString *)fmt, ... 
{ 
    va_list va; 
    va_start(va, fmt);  
    NSString *string = [[NSString alloc] initWithFormat:fmt 
               arguments:va]; 
    va_end(va); 

    // Do thing with string 
} 

Điều quan trọng cần nhớ là các thông số vararg mất kiểu của họ để các chức năng như printf()[NSString stringWithFormat] sử dụng chuỗi định dạng để giúp xác định có bao nhiêu đối số có và cách thức giải thích từng câu hỏi. Nếu bạn cần một ngữ nghĩa khác thì bạn sẽ cần phải cung cấp thông tin này một số cách.

+0

Bạn có thể giải thích về macro varargs không. Tôi khá mới với mục tiêu-c. – Rakesh

+0

@Rakesh Varargs không phải là Objective-C, chúng là C. Xem trang này: http://www.eskimo.com/~scs/cclass/int/sx11b.html – trojanfoe

+0

cảm ơn rất nhiều! hiểu rồi. – Rakesh

Các vấn đề liên quan