Tôi đang sử dụng một macro để đơn giản hóa trở dây cục bộ, như vậy:Objective-C: "chuỗi định dạng không phải là một chuỗi chữ (có khả năng không an toàn)" cảnh báo với vĩ mô
#define GetLocalStr(key, ...) \
[NSString stringWithFormat:[[NSBundle mainBundle] localizedStringForKey:key value:@"" table:nil], ##__VA_ARGS__]
Về cơ bản, nếu bạn có một mục trong một Strings nội địa hóa tập tin như "name" = "My name is %@";
, gọi
GetLocalStr(@"name", @"Foo");
sẽ trả lại NSString @"My name is Foo"
Khi tôi chạy nó tuy nhiên, như:
NSString * str = GetLocalStr(@"name", @"Foo");
Tôi nhận được cảnh báo "chuỗi định dạng không phải là chuỗi chữ". Thậm chí theo lời khuyên của các câu trả lời khác trên SO về cảnh báo này và thay thế nó bằng:
NSString * str = [NSString stringWithFormat:@"%@", GetLocalStr(@"name", @"Foo")];
tôi vẫn nhận được cảnh báo, và bên cạnh đó, nó loại đánh bại điểm của đời sống làm vĩ mô dễ dàng hơn.
Tôi làm cách nào để loại bỏ cảnh báo ngắn gọn khi gói tất cả các cuộc gọi GetLocalStr
trong #pragma suppressors?
Sửa 27/08
Sau khi chạy qua câu trả lời CRD và làm một số xét nghiệm hơn, nó có vẻ như tôi đã thực hiện một giả định xấu về lỗi. Để làm rõ:
Localization Strings file:
"TestNoArgs" = "Hello world";
"TestArgs" = "Hello world %@";
Code:
NSString * str1 = GetLocalStr(@"TestNoArgs"); // gives warning
NSString * str2 = GetLocalStr(@"TestArgs", @"Foo"); // doesn't give warning
Đa số các bản dịch của tôi không có đối số, và những người là những người đưa ra các cảnh báo, nhưng Tôi đã không thực hiện kết nối cho đến khi tôi đọc qua câu trả lời của CRD.
tôi đã thay đổi vĩ mô duy nhất của tôi đến hai, như vậy:
#define GetLocalStrNoArgs(key) \
[[NSBundle mainBundle] localizedStringForKey:key value:@"" table:nil]
#define GetLocalStrArgs(key, ...) \
[NSString stringWithFormat:[[NSBundle mainBundle] localizedStringForKey:key value:@"" table:nil], ##__VA_ARGS__]
Và nếu tôi gọi nhau một cách riêng biệt, không có cảnh báo.
Tôi muốn GetLocalStr
để mở rộng thành GetLocalStrNoArgs
hoặc GetLocalStrArgs
tùy thuộc vào nếu bất kỳ đối số nào được chuyển hay không, nhưng cho đến giờ tôi không có may mắn (macro không phù hợp với tôi: D).
Tôi đang sử dụng sizeof(#__VA_ARGS__)
để xác định xem có bất kỳ đối số nào được chuyển hay không - nó xâu chuỗi các đối số và nếu kích thước là 1, số đó trống (tức là `\ 0 '). Có lẽ nó không phải là phương pháp lý tưởng nhất, nhưng có vẻ như nó hoạt động.
Nếu tôi viết lại tôi GetLocalStr
vĩ mô để:
#define GetLocalStr(key,...) (sizeof(#__VA_ARGS__) == 1) ? GetLocalStrNoArgs(key) : GetLocalStrArgs(key,##__VA_ARGS__)
tôi có thể sử dụng nó, nhưng tôi vẫn nhận được cảnh báo ở khắp mọi nơi nó được sử dụng và không có lý lẽ trôi qua, trong khi một cái gì đó giống như
#define GetLocalStr(key,...) \
#if (sizeof(#__VA_ARGS__) == 1) \
GetLocalStrNoArgs(key) \
#else \
GetLocalStrArgs(key,##__VA_ARGS__)
won' t biên dịch. Làm cách nào để có được macro GetLocalStr
của tôi để mở rộng chính xác?
'@" name "= @" Tên tôi là% @ ";' - chữ cái không được gán, nó sẽ không biên dịch. 'NSString * format = @" Tên tôi là% @ "; NSString * str = GetLocalStr (định dạng, @ "Foo"); NSLog (@ "% @", str); 'không ném bất kỳ cảnh báo nào (tôi chỉ mong đợi nó ở định nghĩa' GetLocalStr'), bạn có thể muốn sửa các trích dẫn và cung cấp thêm chi tiết về nơi cảnh báo xuất hiện. –
Bạn có thể tạo Danh mục NSString để làm điều đó cho bạn. –
@ A-Live tên '@" "= @" Tên tôi là% @ "' dòng trong tệp Bản địa hóa chuỗi, vì vậy về mặt kỹ thuật, nó chỉ nên là "name" = "Tên tôi là% @" - xin lỗi nếu điều đó không rõ ràng. Cảnh báo được gắn cờ trên 'NSString * str = GetLocalStr (...);' line – divillysausages