2009-10-15 33 views
8

Tôi là nhà phát triển iPhone/Objective-C mới và khi tôi thực hiện các hướng dẫn và mã nguồn mở khác nhau, tôi đang gặp một chút vấn đề hiểu khi sử dụng dấu ngoặc vuông "[]" và khi nào thì dùng dấu chấm "." để truy cập các thuộc tính/phương thức của một đối tượng.Khi nào sử dụng dấu ngoặc và thời điểm sử dụng khoảng thời gian trong Mục tiêu-C

Ví dụ, mã này:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 

    [super setSelected:selected animated:animated]; 

    UIColor *backgroundColor = nil; 
    if (selected){ 
    backgroundColor = [UIColor clearColor]; 
    } else { 
    backgroundColor = [UIColor whiteColor]; 
    } 

    self.todoTextLabel.backgroundColor = backgroundColor; 
    self.todoTextLabel.highlighted = selected; 
    self.todoTextLabel.opaque = !selected; 

    self.todoPriorityLabel.backgroundColor = backgroundColor; 
    self.todoPriorityLabel.highlighted = selected; 
    self.todoPriorityLabel.opaque = !selected; 
} 

Tại sao [UIColor clearColor] có dấu ngoặc, nhưng todoTextLabel.backgroundColor có được giai đoạn này?

Ai đó có thể giải thích điều này một cách dễ dàng cho tôi không?

+0

bạn cũng có thể sử dụng. tôi nghĩ rằng phương pháp chấm đã được giới thiệu để làm cho có thể một số tính năng mới với Objective-C 2.0. Tôi tin rằng nó đã làm với keypaths, nhưng tôi có thể sai. Tôi chỉ sử dụng phương pháp chấm nếu nó sẽ tiết kiệm một số không gian trên một cuộc gọi phương thức lồng nhau thực sự dài. – pxl

Trả lời

17

Quy ước tôi đã thấy trong mã mới là sử dụng dấu chấm cho tài sản, và khung luôn sử dụng vuông cho các tin nhắn/selectors (những gì bạn gọi phương pháp). Dấu chấm được giới thiệu trong Mục tiêu-C 2.0, do đó sự bất đồng của thông tin bạn tìm thấy trực tuyến không hoàn toàn bất ngờ.

Nó cũng hoàn toàn có thể sử dụng dấu ngoặc vuông cho tất cả mọi thứ, vẫn (và tôi làm):

foo = [myObject backgroundColor]; 
[myObject setBackgroundColor:foo]; 

tương đương với

foo = myObject.backgroundColor; 
myObject.backgroundColor = foo; 

Nói cách khác, bạn không nên sử dụng dấu chấm cho thư, chỉ các thuộc tính.

Để trả lời câu hỏi cụ thể của bạn, [UIColor clearColor] thuộc về dấu ngoặc đơn vì đó không phải là thuộc tính; nó thực sự là một tin nhắn lớp đến UIColor (+(UIColor)clearColor).

Bạn âm thanh như bạn đến từ một thế giới Java, vì vậy đây có thể hữu ích:

MyObject *foo = [[MyObject alloc] initWithAwesome:YES]; /* MyObject foo = new MyObject(TRUE); */ 
[foo doSomethingWithNumber:5 andString:"five"];   /* foo.doSomething(5, "five"); */ 
MyColor *bar = foo.faceColor;        /* MyColor bar = foo.faceColor; */ 
MyColor *baz = [foo faceColor];       /* MyColor baz = foo.faceColor; */ 
foo.backColor = bar;          /* foo.backColor = bar; */ 
[foo setUndersideColor:baz];        /* foo.undersideColor = baz; */ 

Các "setXXX" và "XXX" thông điệp đến từ tính năng động tổng hợp, và là một thành ngữ Objective-C. "Dấu chấm" chỉ đơn giản là một cách viết tắt để gọi những phương thức đó và gần như tương đương.

EDIT: Bây giờ tôi đã có một số upvotes, thời gian để làm cho một số bạn xem xét lại> :)

tôi không bao giờ sử dụng dấu chấm, và không nên bạn.

+0

bạn có thể cung cấp bất kỳ lý do nào cho việc cấm ký hiệu chấm? – philsquared

+0

xấu, xấu, lập trình viên! – pxl

+0

@Phil Nash: Nó làm cho mã ít rõ ràng hơn. Khi tôi nhìn thấy dấu ngoặc đơn, tôi luôn biết điều gì đó đang xảy ra - một dấu chấm làm cho điều đó ít rõ ràng hơn. Dấu chấm cho tôi cảm thấy như một bài tập, không phải là một thông điệp. Tôi đã có ấn tượng này trước khi tôi đọc bài đăng trên blog Big Nerd Ranch trên đó và họ đồng ý với tôi. Nó chỉ là cú pháp cú pháp khuyến khích thói quen xấu, và là một lập trình viên làm việc tôi biết để giữ cho thói quen của tôi sạch sẽ. Tôi không sợ các dấu ngoặc, nhưng một số người có vẻ như vậy. –

0

Yep, tôi chỉ mới bắt đầu học tập này quá:

Không giống như các ngôn ngữ khác, cú pháp để gọi một phương thức trên một đối tượng không phải là objName.someMethod();

Đó là [objName someMethod]

Dấu chấm nhà điều hành được sử dụng hoặc là có được hoặc thiết lập giá trị của một tài sản trong một lớp học. Đó là một cách ngắn để làm điều gì đó. Các nhà điều hành dấu chấm, như tôi đã thấy nó, luôn được sử dụng trên một thể hiện của một đối tượng trong khi [...] có thể được sử dụng trên một thể hiện của một đối tượng hoặc một cách tĩnh (sử dụng tên lớp).

todoTextLabel cũng có thể sử dụng dấu [] nhưng sử dụng dấu chấm chỉ ngắn hơn ... nếu không bạn sẽ phải cung cấp tham số, v.v. và đó chỉ là ký pháp dài hơn.

Hy vọng điều này sẽ hữu ích.

3

Trang trại Big Nerd có some thoughts trên ký hiệu dấu chấm đáng đọc.

Ngoài ra còn có rebuttal.

+0

Đây là những lần đọc tốt, và tốt để thấy rằng thành ngữ tôi chọn khi tôi thấy ký hiệu chấm được khuyến khích bởi BNR. –

+0

Tôi nghĩ rằng bác bỏ là bắt buộc đọc và làm rõ chỉ là lý do tại sao dấu chấm là một ý tưởng tốt - cùng với việc sử dụng thích hợp. Tôi cũng có những phản đối tương tự với ý định che giấu ký hiệu chấm, với tôi nó làm cho ý định rõ ràng hơn. –

2

Theo quy ước (mạnh), người truy cập thuộc tính được viết dưới dạng phương thức được đặt tên theo biến mẫu cho trình lấy và tên biến thể được viết hoa đầu tiên bằng "set" cho setter (ví dụ: có foo và setFoo).

Như những người khác đã chỉ ra, như của Objective-C 2.0, nếu bạn viết object.foo, nó sẽ ánh xạ vào cuộc gọi phương thức [object foo] nếu nhận được hoặc [object setFoo: arg] để thiết lập. Bạn có thể sử dụng một trong hai biểu mẫu và một số người tiếp tục thích cú pháp phương thức đầy đủ hơn ngay cả khi chỉ sử dụng Objective-C 2.0.

Riêng biệt, nhưng có liên quan, ngoài mục tiêu-C 2.0 là thuộc tính @/@ synthesize/@ dynamic keywords để tạo ra các getters và setters. Bạn có thể trộn và kết hợp chúng với ký hiệu chấm - một không yêu cầu cái kia.

5

tôi sử dụng ký hiệu dấu chấm cho tài sản bởi vì,

for (Person *person in group.people){ ... } 

là một chút dễ dàng hơn để đọc hơn

for (Person *person in [group people]){ ... } 

trong trường hợp khả năng đọc thứ hai được interupted bằng cách đặt bộ não của bạn vào thông điệp chế độ gửi, trong khi trong trường hợp đầu tiên, rõ ràng là bạn đang truy cập vào thuộc tính con người của đối tượng nhóm.

Tôi cũng sẽ sử dụng nó khi sửa đổi một bộ sưu tập, ví dụ:

[group.people addObject:anotherPerson]; 

là một chút dễ đọc hơn

[[group people] addObject:anotherPerson]; 

Sự nhấn mạnh trong trường hợp này phải ở trong hành động của việc thêm một đối tượng với mảng thay vì chuỗi hai thư.

+0

+1 Tôi thích ví dụ này về khả năng đọc nhiều hơn hầu hết mọi người khi mọi người tranh luận về dấu chấm và dấu ngoặc đơn. Tôi thường sử dụng các dấu ngoặc và tìm thấy chúng dễ đọc hơn 90% thời gian nhưng đây là ví dụ điển hình về các trường hợp chúng không dễ đọc. – Toby

Các vấn đề liên quan