Sự khác biệt giữa một computed property và một property được đặt tới một closure là gì?

{{FormatNumbertoThousand(model.total_like)}} lượt thích
176 lượt xem
Swift middle

Vấn đề:

Closure:

var pushBehavior: UIPushBehavior = {
   let lazilyCreatedPush = UIPushBehavior()
   lazilyCreatedPush.setAngle(50, magnitude: 50)
   return lazilyCreatedPush
}()

Computed:

var pushBehavior: UIPushBehavior {
   get{
      let lazilyCreatedPush = UIPushBehavior()
      lazilyCreatedPush.setAngle(50, magnitude: 50)
      return lazilyCreatedPush
   }
}

Giải pháp:

Nói ngắn gọn,

  • Ví dụ đầu tiên là một thuộc tính được lưu trữ (stored property) được khởi tạo thông qua một closure, với closure đó chỉ được gọi một lần, khi nó được khởi tạo. Closure khởi tạo của thuộc tính được lưu trữ được gọi một lần và chỉ một lần, nhưng sau đó bạn có thể thay đổi giá trị của thuộc tính được lưu trữ (trừ khi bạn thay thế var bằng let). Điều này hữu ích khi bạn muốn đóng gói mã để khởi tạo thuộc tính được lưu trữ trong một khối mã ngắn gọn, duy nhất.
  • Ví dụ thứ hai là một thuộc tính được tính toán (computed property) có khối get được gọi mỗi khi bạn tham chiếu đến thuộc tính đó. Nói chung, bạn làm điều này khi thuộc tính được tính toán cần được tính toán lại mỗi khi bạn tham chiếu đến thuộc tính được lưu trữ (ví dụ: được tính toán lại từ các thuộc tính được lưu trữ khác, có thể là private).

Trong trường hợp này, bạn chắc chắn muốn thuộc tính được lưu trữ (ví dụ đầu tiên), không phải thuộc tính được tính toán (ví dụ thứ hai). Có lẽ bạn không muốn có một đối tượng mới mỗi khi bạn tham chiếu đến biến.

{{login.error}}