Cách tốt nhất để biết khi nào tôi đã tiếp cận đối tượng cuối cùng trong một mảng khi sử dụng liệt kê nhanh? Có cách nào tốt hơn là tăng một int và sau đó so sánh với chiều dài của mảng?Mục tiêu C: Đối tượng cuối cùng khi sử dụng liệt kê nhanh?
Trả lời
Nếu bạn đang bắt đầu với một mảng thoát khỏi yếu tố cuối cùng (có' s một cuộc gọi cụ thể cho điều đó) và so sánh từng yếu tố bạn nhận được trong điều tra chống lại điều đó. Một cái gì đó như:
id lastEl = [myArray lastObject];
for (id anEl in myArray)
{
if (anEl == lastEl)
..... // do the last thing
}
Chi phí so sánh là giống như với các truy cập, nhưng sau đó bạn không cần phải chi phí incrementing quầy hoặc sai lầm mà luôn nảy sinh khi bạn quên tăng quầy.
Tôi không tin rằng có cách nào (đơn giản) để làm điều này - đó là một trong những sự cân bằng của việc sử dụng liệt kê nhanh. Như vậy, khi bạn cần phải biết về chỉ mục của mục bạn đang liệt kê, bạn sẽ cần phải tạo một số nguyên như bạn đề xuất.
Điều đó nói rằng, bạn vẫn sẽ được hưởng lợi từ thực tế là bạn không thể đi ra ngoài giới hạn khi sử dụng một điều tra viên nhanh chóng, vv
Thông thường, nhanh chóng liệt kê có nghĩa là bạn không sử dụng một bộ đếm ...
các hình thức khác được mà không cần một bộ đếm là ...
NSEnumerator *enumerator = [objectSet objectEnumerator];
id setObject;
while ((setObject = [enumerator nextObject]) != nil)
{
...
}
Nếu kiểm tra hiệu suất chịu trách nhiệm here, không có sự khác biệt về hiệu suất giữa liệt kê nhanh và liệt kê khối. Hoặc bbum đã nói here "Loại liệt kê dựa trên khối cho phép lớp thu thập liệt kê nội dung nhanh nhất khi duyệt qua định dạng lưu trữ gốc."
Sau đó, tôi sẽ đề xuất sử dụng liệt kê khối để bạn lấy chỉ mục và đối tượng ở cùng một thời gian và bạn có thể so sánh.
Bạn cũng có thể sử dụng liệt kê với các khối:
[myArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
BOOL isLastObject = idx == [myArray count]-1;
if (isLastObject){
//...
}
}];
Nếu bạn biết rằng những loại đối tượng mảng của bạn có chứa nó tốt hơn để thay thế id
với lớp thích hợp.
Tôi đồng ý với điều này, nhưng tôi tin rằng đó là "lastObject" không phải "lastElement". – slycrel
Bây giờ bạn và tôi đồng ý! Đó là những gì tôi nhận được khi không kiểm tra tài liệu SDK cho cuộc gọi. –
Câu trả lời hay và chỉ là những gì tôi đang tìm kiếm! –