2013-01-23 22 views
29

tôi đã viết một loại nhỏ trên NSString, và tôi muốn biết nếu phương pháp này được xử lý một cách chính xác tất cả các trường hợp sử dụng tiềm năng:Kiểm tra NSString "không có hoặc trống" - đã hoàn thành chưa?

Cập nhật: để làm rõ - tôi muốn chắc chắn rằng tôi không thiếu một số trường hợp kỳ quặc liên quan đến bảng mã ký tự, vv ..

@implementation NSString (Helpers) 

+(BOOL)stringIsNilOrEmpty:(NSString*)aString { 
    if (!aString) 
     return YES; 
    return [aString isEqualToString:@""]; 
} 
@end 

sử dụng mẫu:

-(void) sampleUsage { 
    NSString *emptyString = @""; 
    NSString *nilString = nil; 
    NSAssert([NSString stringIsNilOrEmpty:nilString] == YES, @"String is nil/empty"); 
    NSAssert([NSString stringIsNilOrEmpty:emptyString] == YES, @"String is nil/empty"); 
} 
@end 
+1

Điều đó sẽ hiệu quả. Có hàng chục cách khác nhau để kiểm tra "trống" - length == zero là một cách khác. –

+6

Trong thực tế, bạn có thể (rùng mình) chỉ sử dụng một thử nghiệm: 'if ([aString length] == 0) trả về YES;'. Điều này làm cho việc sử dụng tính năng Objective-C "" mà bất kỳ phương thức nào gọi tắt của một con trỏ nil đều trả về số không. –

+3

(Và, tất nhiên, bạn có thể rút ngắn điều đó thành 'return [aString length] == 0;') –

Trả lời

110

tôi chỉ sử dụng có điều kiện tiếp theo và thậm chí không cần một thể loại:

if (!aString.length) 
{ 
    ... 
} 

Sử dụng lý thuyết Objective-C, một thông điệp tới NIL sẽ trở lại con số không hoặc không có, vì vậy về cơ bản bạn không có để kiểm tra cho nil.

+2

! AString.length là true khi aString là không, tôi không biết tại sao. Nhưng 'aString.length! = 0' hoạt động cho tôi! – JordanChina

+1

Đó là chính xác những gì nó nên - đúng cho chuỗi nil. – Stas

28

Bạn có thể đơn giản hóa mã bằng cách loại bỏ điều kiện:

+(BOOL)stringIsNilOrEmpty:(NSString*)aString { 
    return !(aString && aString.length); 
} 
+16

Vài nit-pick: Cú pháp Dot thực sự nên được sử dụng cho các thuộc tính chứ không phải các phương thức. Chiều dài là một phương pháp. Như một tiền thưởng thêm, nếu bạn gọi chiều dài chính xác bạn không phải kiểm tra cho nil bao giờ một lần nữa liên quan đến chuỗi. Vì vậy, bạn có thể 'return [aString length] == 0;' Điều này làm việc bởi vì độ dài gọi trên một số không trả về 0. – memmons

2

Một số ví dụ về loại kiểm tra "không trống hoặc trống" này là danh mục trên NSString.

// Please note that in general I advocate using a prefix on category methods 
// to avoid category collisions. I've not done this here for clarity. 
// The @interface is also excluded from this example for brevity. 

@implementation NSString (MyAdditions) 

- (BOOL)isNotEmpty 
{ 
    return [self length] != 0; 
} 

- (BOOL)isNotBlank 
{ 
    if ([self isNotEmpty]) 
    { 
    NSCharacterSet *nonWhitespaceSet = [[NSCharacterSet whitespaceAndNewlineCharacterSet] invertedSet]; 
    NSRange range = [self rangeOfCharactersFromSet:nonWhitespaceSet]; 
    return range.location != NSNotFound; 
    } 

    return NO; 
} 

@end 
+0

nếu chuỗi là không, thì phương thức đó sẽ không được gọi. – c0ming

+0

@ c0ming nhưng kết quả sẽ đúng. Gửi tin nhắn đến chuỗi nil sẽ trả về NO là kết quả. Để nhận được YES từ chuỗi phương thức này ít nhất không nên là nil, thì nó phải vượt qua bài kiểm tra. – kokoko

7

@ câu trả lời dasblinkenlight là tốt, nhưng một tấm séc có điều kiện nhiều dễ đọc hơn Tôi sẽ sử dụng là:

NSString *string = ...; // define the string 
if ([string length] == 0) { 
    // Do stuff with the string 
} else { 
    // The string is empty or nil here 
} 

Rất ngắn gọn và không cần định nghĩa hàm tiện riêng biệt. Thật dễ dàng để nhớ.

EDIT: @Michael G. Emmons đã đăng nhận xét này làm nhận xét cuối cùng cho câu trả lời đó ... tín dụng cho anh ấy nhưng tôi liệt kê đây là câu trả lời theo đúng nghĩa của nó.

+0

Cảm ơn câu trả lời của bạn. Câu hỏi đặt ra là về việc thực hiện đúng phương thức 'isStringNilOrEmpty' - tôi muốn một phương thức duy nhất có thể kiểm tra cả hai điều kiện. –

+0

Tôi tin rằng tình trạng của bạn bị đảo ngược. – oldergod

0

Đơn giản chỉ cần kiểm tra chiều dài chuỗi của bạn

> if (!yourString.length){ 
>  //your code } a 

thông điệp tới NIL sẽ trở lại con số không hoặc 0, vì vậy không cần phải kiểm tra cho :) nil.

Chúc mừng mã hóa ...

0

Hãy chắc chắn để kiểm tra không gian, cắt không gian trắng trước khi tính toán chiều dài.

+(BOOL)stringIsNilOrEmpty:(NSString*)aString { 
    return !aString || [[aString stringByTrimmingCharactersInSet: 
        [NSCharacterSet whitespaceCharacterSet]] length] == 0; 
} 
Các vấn đề liên quan