2013-07-23 37 views
5

Trong khi làm việc trên mã dự án còn lại cho tôi bằng một dev trước, tôi đã gặp phải xây dựng sau đâyObjective C tại sao định dạng chuỗi như chuỗi

-(NSString *)StringCheckWithString:(NSString *)string{ 

    NSString *string2 = [NSString stringWithFormat:@"%@", string]; 

    if([string2 length] == 0){ 
     return @"none"; 
    } 
    else { 
     return string2; 
    } 
} 

bất cứ ai có thể giải thích lý do tại sao bạn nên làm việc này, có vẻ như overengineered đáng kể vào tôi và tôi không hiểu tại sao nó đã được thực hiện theo cách này (cho rõ ràng, tôi không hiểu tại sao chuỗi được định dạng như thế này, tôi hiểu kiểm tra chiều dài)

+3

Có thể 'chuỗi' là đầu vào không xác định. Nếu nó chứa các ký tự định dạng và bạn sử dụng nó, BAD THINGS có thể xảy ra. – thegrinner

+2

@thegrinner chắc chắn trong trường hợp 'chuỗi' chứa các ký tự định dạng,' string2' bây giờ cũng chứa các ký tự đó? – James

+0

Tôi đang cố gắng quấn đầu xung quanh một tình huống mà một NSString được chuyển đến một phương pháp KHÔNG PHẢI LÀ một NSString. Có ai có một ví dụ cụ thể làm thế nào để đạt được tình hình đó? – Dan

Trả lời

8

Đối số được thông qua có thể là bất kỳ lớp con của chuỗi, bao gồm cả NSMutableString. Mã này tạo ra một bản sao bất biến của nó. Điều này có nghĩa là bạn có thể lưu trữ chuỗi trả về mà không phải lo lắng về việc ai đó đang sửa đổi nó.

Cách tốt hơn để làm điều này sẽ là:

NSString *string2 = [string copy]; 

Theo NSCopying Protocol reference:

Bản sao trở là không thay đổi nếu việc xem xét “bất biến vs có thể thay đổi” áp dụng đối với việc tiếp nhận vật.

+0

Tôi thích câu trả lời này.Từ kiểm tra việc sử dụng, tôi nghi ngờ đó là ý định, nhưng nó có ý nghĩa như một hiệu ứng mong muốn – James

+8

'[string copy]' có vẻ rõ ràng hơn với tôi. – jszumski

+0

Tôi đồng ý với @jszumski - nếu tôi định viết một cái gì đó cho hiệu ứng đó, tôi sẽ sử dụng 'copy'. – Jasarien