2009-04-10 13 views
58

Nếu tôi có phương thức trả về số BOOL, làm cách nào để truyền số đó vào NSString để tôi có thể in ra trong bảng điều khiển?BOOL để NSString

Ví dụ, tôi đã cố gắng làm điều này, đó là không làm việc:

NSLog(@"Is Kind of NSString:", ([thing isKindOfClass:[NSString class]]) ? @"YES" : @"NO"); 

Nhưng tôi thực sự muốn thực sự biến giá trị trả về vào một NSString. Tôi biết đó là một kiểu dữ liệu nguyên thủy, vì vậy tôi không thể gọi các phương thức trên đó. Tôi có phải tạo một chuỗi riêng biệt và sau đó sử dụng Bool làm tham số trong một phương thức trên NSString không?

+2

Vấn đề với tuyên bố của bạn đơn giản là bạn không bao gồm bất kỳ trình định dạng định dạng nào trong đối số đầu tiên cho NSLog. Không có gì để làm với BOOL hay không. –

Trả lời

63

Bạn cần một specifier định dạng trong chuỗi định dạng của bạn:

NSLog(@"Is Kind of NSString: %@", ([thing isKindOfClass:[NSString class]]) ? @"YES" : @"NO"); 
3

NSLog sử dụng một đơn giản định dạng gọi printf kiểu văn bản của nó, và ví dụ mã của bạn là mất tích chuỗi ký tự cần thiết để nhúng một đối tượng.

này nên làm việc:

NSLog(@"Is Kind of NSString: %@", ([thing isKindOfClass:[NSString class]]) ? @"YES" : @"NO"); 
64

Sử dụng một ternary operator:

BOOl isKind= [thing isKindOfClass:[NSString class]]; 

NSLog(@"Is Kind of NSString: %d", isKind); 
NSLog(@"Is Kind of NSString: %@", isKind ? @"YES" : @"NO"); 
+8

Bạn đang thiếu '@' trước các chuỗi đó. – willc2

+0

Bí quyết tuyệt vời ở đó! –

32

Trong các hành vi nền BOOL như một kiểu int, do đó bạn có thể sử dụng% i để kiểm tra giá trị của một kiểu BOOL trong NSLog :

BOOL a = YES; 
BOOL b = NO; 
NSLog(@"a is %i and b is %i", a, b); 

// Output: a is 1 and b is 0 
+0

Cảm ơn, điều này làm việc tuyệt vời +1 –

22

Vì vậy, tôi biết rằng điều này thực sự cũ, nhưng tôi nghĩ tôi cũng có thể quăng olution vào vòng. Tôi làm:

#define NSStringFromBOOL(aBOOL) ((aBOOL) ? @"YES" : @"NO") 
NSLog(@"Is Kind of NSString: %@", NSStringFromBOOL([thing isKindOfClass: [NSString class]]); 

tôi cảm thấy rằng đây là phù hợp hơn với một số của Apple để chuỗi macro (NSStringFromClass, NSStringFromRect, NSStringFromSelector, và vân vân), và nói chung khá đơn giản để sử dụng on-the-fly. Chỉ cần chắc chắn để đưa rằng vĩ mô một nơi nào đó trên toàn cầu có thể truy cập, hoặc thường xuyên nhập khẩu!

+13

Không phải là một ý tưởng tốt để tiền tố những thứ với NS-. Đó là tiền tố của Apple. Nó dẫn đến khá một chút thất vọng khi họ thêm nó sau này và định nghĩa của bạn bắt đầu một cách tinh tế xung đột. – Chuck

+5

Nhưng bạn sẽ làm gì khi đối tượng bạn đang kiểm tra là * thực sự có tên * NSString? Gọi nó là bất cứ điều gì khác sẽ không đại diện cho những gì nó kiểm tra. – chroipahtz

+2

Đồng ý với Chuck; macro sẽ được đặt tên tốt hơn là 'BOOLToNSString()'. @chroipahtz –

12

Bạn in một BOOL như thế này:

NSLog(@"The BOOL value is %s", theBoolValue ? "YES" : "NO"); 

Hoặc, với @ ký hiệu mới, người ta có thể làm:

NSLog(@"The BOOL value is %@", @(theBoolValue)); 
+0

Cái này phải đủ tốt. – justinkoh

-1

Đây là công việc cho tôi:

NSLog(@"The BOOL value is %@", theBoolValue ? "YES" : "NO"); 
+0

Điều đó sẽ không hoạt động khi '" CÓ "' sẽ không trả lời '% @'. – Droppy

0

Trước hết bạn nên thêm một trình định dạng định dạng %@. Nó sẽ giống như thế này:

NSLog(@"Is Kind of NSString: %@", ([thing isKindOfClass:[NSString class]]) ? @"YES" : @"NO"); 

Ngoài ra bạn có thể trích xuất một chuyển đổi BOOL-NSString với chức năng extern như Apple đã làm với NSStringFromCGRect, NSStringFromClass, vv

Tạo utils nộp hoặc thêm vào hiện những tiêu đề đoạn mã sau:

//NSString+TypeConversion.h 

extern NSString *NSStringFromBOOL(BOOL aBool); 

Và cũng thêm đoạn mã sau vào thực hiện:

//NSString+TypeConversion.m 

NSString *NSStringFromBOOL(BOOL aBool) 
{ 
    return aBool ? @"YES" : @"NO"; 
} 

Vì vậy, bây giờ bạn có thể sử dụng chức năng này ở những nơi khác và mã của bạn trở nên rõ ràng hơn và có thể sử dụng lại được:

#import "NSString+TypesConversion.h" 

NSLog(@"Is Kind of NSString: %@", NSStringFromBOOL([thing isKindOfClass:[NSString class]]));