2015-10-12 18 views
6

Tôi hiểu rằng một người là người đặt cược và người kia là người quan sát thuộc tính. Câu hỏi của tôi là làm thế nào để chúng khác nhau trong hành vi và khi nào bạn sẽ sử dụng một trong những khác. Họ không làm điều tương tự? Ví dụ:Sự khác nhau cơ bản giữa set và didSet là gì?

var foo: String { 
set { 
    run code when set 
} 
} 

var foo: String { 
didSet { 
    run code when set 
} 
} 

Trả lời

9

Chúng không làm điều tương tự, ngược lại chúng có mục đích hoàn toàn khác nhau. Các getset được sử dụng trên các thuộc tính được tính toán. Ví dụ, lấy cấu trúc ví dụ này không có sử dụng thực sự, nhưng là một bản demo tốt.

struct test { 
    var x = 5 
    var y = 5 
    var number: Int { 
     get { 
      return x * y 
     } 
     set (newValue){ 
      x = newValue/2 
      y = newValue/2 
     } 
    } 
} 

var s = test() 
s.number //25 
s.number = 100 
s.x //50 
s.number //2500 

Vì vậy, như bạn có thể thấy, biến number không phải là một biến theo nghĩa truyền thống, đó là thuộc tính được tính toán. Vì vậy, khi tôi gọi s.number tôi nhận được sản phẩm của x và y. Ngoài ra, bạn sẽ sử dụng tập hợp này để thay đổi các biến khác (không phải thuộc tính được tính toán) trong cấu trúc. Vì vậy, tôi đặt xy thành các giá trị khác nhau dựa trên newValue. Ý tưởng về một thuộc tính được tính toán có thể được sử dụng thay cho hàm và tôi thấy rất hữu ích trong việc đơn giản hóa việc truy xuất dữ liệu từ một hàm. Ví dụ, bạn có thể có một cấu trúc mà có một khoảng cách bằng km và bạn có thể muốn rằng trong dặm rất thường xuyên. Vì vậy, bạn có thể tạo ra một tài sản tính miles hàng dặm mà tính toán số km với phương pháp get, và thay đổi số km với setter nếu bạn thiết lập dặm đến trong chương trình của bạn.


Bây giờ, cho didSetwillSet. Bạn có thể sử dụng các thông báo này để thông báo cho cấu trúc của bạn về thay đổi giá trị. Ví dụ: một averageTracker.

struct averageTracker { 
    var total: Double = 0 { 
     didSet { 
      numEntries++ 
     } 
    } 
    var numEntries: Double = 0 
    var average: Double { 
     get { 
      return total/numEntries 
     } 
    } 
} 


var ave = averageTracker() 
ave.total += 10 
ave.total += 20 
ave.average //15 

Lưu ý cách thức didSet thực sự là một biến chứa giá trị, nghĩa là không phải là thuộc tính được tính toán. Ngoài ra, tôi đã sử dụng thuộc tính được tính average để nhận mức trung bình. Nói chung, tôi hy vọng tôi xóa bỏ sự nhầm lẫn của bạn về khía cạnh rất mạnh mẽ này của Swift.

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