2014-11-20 15 views
14

Tôi đang cố dịch một số mã Objective-C về cơ bản là tải xuống biến nhiều lần. Mã này là tương tự như sau:Biến lười biếng nhanh chóng tải nhiều hơn một lần (Thuộc tính tính?)

-(NSFetchedResultsController *)fetchedResultsController { 
    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 
    //...code to build the fetchedResultsController with a new predicate 

Bất cứ khi nào họ muốn xây dựng lại các fetchedResultsController sử dụng một vị mới, họ sẽ chỉ đặt nó là "con số không" và gọi nó, và nó sẽ xây dựng lại nó với một vị mới .

Tôi đang cố gắng thực hiện tác vụ tương tự này trong Swift. Theo như tôi có thể nói, biến lười biếng Swift trở thành biến bình thường sau khi chúng được gọi lần đầu tiên. Điều này đang gây ra vấn đề cho tôi bởi vì nếu tôi cố gắng đặt biến nhanh chóng của tôi trở lại nil, và nhớ lại nó, nó không xây dựng lại nhưng vẫn là không.

Mã hoạt động để tải fetchedResultsController của tôi dưới dạng biến thể lười biếng bên dưới. Tôi đã thử thay đổi nó thành một thuộc tính tính bằng cách thêm một kiểm tra nếu nil của nó và có nó trong một khối nhận được, nhưng điều đó đã không làm việc. Bất kỳ ý tưởng?

lazy var taskController : NSFetchedResultsController? = { 
     var subtaskRequest = NSFetchRequest(entityName: "Subtasks") 
     var segIndex = self.segmentedControl.selectedSegmentIndex 
     subtaskRequest.predicate = NSPredicate(format: "task.category.name == %@", self.segmentedControl.titleForSegmentAtIndex(segIndex)!) 
     subtaskRequest.sortDescriptors = [NSSortDescriptor(key: "task.englishTitle", ascending: true), NSSortDescriptor(key: "sortOrder", ascending: true)] 


     let controller = NSFetchedResultsController(fetchRequest: subtaskRequest, managedObjectContext: 
      self.managedObjectContext!, sectionNameKeyPath: "task.englishTitle", cacheName: nil) 
     controller.delegate = self 
     return controller 
    }() 

Trả lời

21

Bạn có thể tạo một cái gì đó tương tự như phương pháp Objective-C bằng cách sử dụng một thuộc tính tính được hỗ trợ bởi một biến tùy chọn.

var _fetchedResultsController: NSFetchedResultsController? 

var fetchedResultsController: NSFetchedResultsController { 
    get { 
     if _fetchedResultsController != nil { 
      return _fetchedResultsController! 
     } 
     //create the fetched results controller... 
     return _fetchedResultsController! 
    } 
} 
+0

Tuyệt vời. Điều đó làm việc hoàn hảo – Unome

+0

những gì một điều khó khăn nên bây giờ phát triển làm ((Cảm ơn bạn rất nhiều –

5

lazy chỉ thực hiện mẫu ghi nhớ rất cụ thể. Nó không phải là huyền diệu như bạn đôi khi muốn nó được. Bạn có thể thực hiện mẫu của riêng bạn để phù hợp với mã ObjC của bạn khá dễ dàng.

Chỉ cần tạo thuộc tính tùy chọn riêng thứ hai chứa giá trị thực. Tạo một thuộc tính được tính toán chuẩn (không lười) để kiểm tra thuộc tính riêng cho nil và cập nhật nó nếu nó là 0.

Điều này khá giống với hệ thống ObjC. Trong ObjC, bạn có hai "thứ", một cái gọi là _fetchedResultsController và cái kia được gọi là self.fetchedResultsController. Trong Swift bạn sẽ có hai thứ, một gọi là self.fetchedResultsController và cái còn lại được gọi là self._cachedFetchedResultsController (hoặc bất kỳ thứ gì).

+0

Cảm ơn, tôi nhận thấy rằng bản thân bây giờ là cần thiết. – Unome

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