Trong nỗ lực của tôi để hiểu những gì tôi có thể và không thể làm với một va_list trong (Objective-) C, tôi đi qua câu đố nhỏ này. Tôi đã hy vọng tạo ra một loại trên NSString
mà sẽ đơn giản hóa các thông báo stringWithFormat:
một chút trong một số trường hợp, chỉ cho những niềm vui của nó. Những gì tôi đang nhắm đến là có thể sử dụng cách triển khai như sau:Tôi có thể sửa đổi danh sách va_list trước khi chuyển nó không?
[@"My %@ format %@!" formattedWith:@"super", @"rocks"];
Hy vọng kết thúc bằng một chuỗi có ghi "My super format rocks!
". My (không chính xác) phương pháp thực hiện như sau:
- (NSString *)formattedWith:(NSString *)arguments, ...
{
va_list list;
va_start(list, arguments);
NSString *formatted = [[[NSString alloc] initWithFormat:self arguments:list] autorelease];
va_end(list);
return formatted;
}
Bây giờ vấn đề là càng sớm càng va_start()
được gọi, va_list được 'rút ngắn' (vì thiếu một từ tốt hơn) và chỉ chứa các phần còn lại của đối số (trong trường hợp ví dụ chỉ còn lại @"rocks"
, cộng với đối tượng gọi mà tôi không quan tâm). Những gì được truyền vào thông báo initWithFormat:
do đó kết xuất sai loại kết quả.
Đến câu hỏi. Có cách nào để sửa đổi va_list trước khi tôi chuyển nó tới thông báo initWithFormat:
, vì vậy bằng cách nào đó tôi có thể chuyển đối số đầu tiên trở lại vào danh sách?
Tôi không tìm kiếm một quy trình lặp đi lặp lại nơi tôi tự mình xem qua va_list, tôi đang tìm hiểu các giới hạn của va_list nói chung. Cảm ơn!
Có thể bài đăng trên blog này hữu ích http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html –