gì chúng được gọi là, nói chung, là "chức năng variadic" (hoặc các phương pháp, vì nó là) .
Để tạo này, chỉ cần cuối phương pháp declartion của bạn với , ...
, như trong
- (void)logMessage:(NSString *)message, ...;
Tại thời điểm này, bạn có thể muốn quấn nó trong một hàm printf
-like, như thực hiện một trong những từ đầu đang cố gắng, tốt nhất.
- (void)logMessage:(NSString *)format, ... {
va_list args;
va_start(args, format);
NSLogv(format, args);
va_end(args);
}
Lưu ý việc sử dụng NSLogv
và không NSLog
; xem xét NSLog(NSString *, ...);
so với NSLogv(NSString *, va_list);
hoặc nếu bạn muốn một chuỗi; initWithFormat:arguments:
trên NSString *
.
Nếu, mặt khác, bạn không làm việc với chuỗi, mà là một cái gì đó giống như
+ (NSArray *)arrayWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION;
mọi thứ trở nên dễ dàng hơn rất nhiều.
Trong trường hợp đó, thay vì hàm vprintf
kiểu, hãy sử dụng vòng lặp đi qua args
, giả sử id khi bạn đi và phân tích cú pháp chúng như bạn thực hiện trong bất kỳ vòng lặp nào.
- (void)logMessage:(NSString *)format, ... {
va_list args;
va_start(args, format);
id arg = nil;
while ((arg = va_arg(args,id))) {
/// Do your thing with arg here
}
va_end(args);
}
Mẫu cuối cùng này, giả định rằng danh sách va_args không được chấm dứt.
Lưu ý: Để thực hiện việc này, bạn sức mạnh phải bao gồm <stdarg.h>
; nhưng nếu bộ nhớ phục vụ, điều này được bao gồm trong kết nối với NSLogv, có nghĩa là nó đi xuống bằng cách "Foundation.h", do đó cũng "AppKit.h" và "Cocoa.h", cũng như một số người khác; vì vậy điều này sẽ làm việc ra khỏi hộp.
Một điều cần lưu ý ở đây là, tham số NSString đầu tiên ở đây có dạng là định dạng và tham số khác được chuyển trong đối số biến. đúng? Vì vậy, trước khi vào vòng lặp for, bạn có một tham số để xử lý. – karim
Tuy nhiên, có thể tránh điều 'chấm dứt' không? ví dụ. nhận được độ dài của các đối số biến? – karim
@karim: Không thể với varargs C để biết số lượng và loại đối số. Các chức năng được gọi là bằng cách nào đó biết các loại và khi nào dừng lại. – newacct