Phương thức urlForId:params:parts:
của bạn hy vọng đối số đầu tiên sau bàn phím parts:
là NSString*
, nhưng bạn đang chuyển nó theo số va_list
. Đó là những loại khác nhau. Việc chuyển một biến số va_list
làm tham số hàm không mở rộng nó một cách kỳ diệu vào tất cả các đối số ban đầu. Dưới bìa một va_list
thực sự chỉ là một con trỏ vào khung ngăn xếp của bạn, và đó là tất cả những gì được thông qua.
Những gì bạn thực sự cần làm ở đây là đưa ra phần urlForId:params:parts:
đi vào danh sách các bộ phận và gọi phần được tính toán đó trực tiếp từ specialUrlForId:params:parts:
. Có lẽ phương pháp urlForId:params:parts:
của bạn trông giống như sau:
- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ...
{
va_list ap;
va_start(ap, aPart);
// loop over the variable arguments, starting with aPart, perhaps
// stopping when you find nil.
while (aPart != nil) {
doSomething(aPart);
aPart = va_arg(ap, NSString *);
}
va_end(ap);
return someUrl;
}
Vì vậy, những gì bạn muốn làm ở đây là di chuyển các phần sau va_start
và trước va_end
đến một phương pháp mà phải mất một tham số va_list
:
- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams arguments:(va_list)ap
{
// loop over the variable arguments, starting with aPart, perhaps
// stopping when you find nil.
while (aPart != nil) {
doSomething(aPart);
aPart = va_arg(ap, NSString *);
}
return someUrl;
}
Sau đó, bạn làm cho cả hai urlForId:params:parts:
và specialUrlForId:params:parts:
gọi phương thức mới này là urlForId:params:arguments:
:
- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ...
{
va_list ap;
va_start(ap, aPart);
NSURL *url = [self urlForId:aId params:aParams arguments:ap];
va_end(ap);
return url;
}
- (NSURL *)specialUrlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ...
{
va_list ap;
va_start(ap, aPart);
NSURL *url = [self urlForId:aId params:aParams arguments:ap];
va_end(ap);
return url;
}
Nguồn
2011-12-14 05:27:42
Cuối cùng, tôi làm lại mã của tôi để tôi có thể tránh đi qua trong varargs, nhưng điều này giải thích tình hình thực sự tốt. – Luke