2015-03-30 12 views
5

Tôi mới sử dụng Swift và chơi với ngôn ngữ. Tôi đã tìm hiểu khái niệm về biến được tínhquan sát viên biến. Tôi muốn biết nếu nó có thể xác định cả hai người trong số họ cùng một lúc khi tôi xác định một biến. Tôi đã thử nhưng thất bại. Dưới đây là mã của tôi (không hoạt động!).Ngôn ngữ Swift: Cách xác định biến được tính toán với người quan sát?

var a:Int = 88 
{ 
    get 
    { 
     println("get...") 
     return 77 
    } 

    set 
    { 
     a = newValue + 1 
    } 
} 
{ 
    willSet 
    { 
     println("In willSet") 
     println("Will set a to \(newValue)") 
     println("Out willSet") 
    } 

    didSet 
    { 
     println("In didSet") 
     println("Old value of a is \(oldValue)") 
     println(a) 
     if(a % 2 != 0) 
     { 
      a++ 
     } 
     println("Out didSet") 
    } 
} 

println(a) 
a = 99 

println(a) 

Tôi muốn biết, điều này có khả thi không? Cảm ơn.

+0

Ở trên sẽ không biên dịch - niềng răng không đúng chỗ. – GoZoner

Trả lời

3

Nó không thể được thực hiện:

Welcome to Swift version 1.2. Type :help for assistance. 
    1> class Foo { 
    2.  var bar : Int { 
    3.   get { return 1 } 
    4.   willSet { println ("will") } 
    5.  } 
    6. }  
repl.swift:3:9: error: willSet variable may not also have a get specifier 
     get { return 1 } 
     ^

Các thông báo lỗi mô tả tại sao.

1

Tôi nghĩ rằng các nhà quan sát thuộc tính chỉ có thể được áp dụng cho các thuộc tính được lưu trữ. Tính chất và quan sát thuộc tính tương tự theo nghĩa là cả hai đều được gọi khi giá trị của một thuộc tính thay đổi và chúng tôi thậm chí có thể coi Thuộc tính được tính là Người quan sát thuộc tính

Vì vậy, tôi không nghĩ rằng chúng tôi có thể xác định biến được tính toán người quan sát.

6

Câu trả lời ngắn gọn là không thể.

Tôi nghĩ ý tưởng về Thuộc tính được tính và Thuộc tính được lưu trữ là hoàn toàn độc quyền.

Nói về Thuộc tính được lưu trữ, hãy nghĩ về các biến thành viên có tính năng để biết thời điểm chúng được thiết lập hoặc gán. Chúng được lưu trữ không được tính toán và do đó chúng có thể được gán một giá trị và có thể được thiết lập hoặc gán bởi lớp khác hoặc các phương thức bên ngoài lớp xác định.

Trong trường hợp Thuộc tính được tính, chúng được tính mỗi khi chúng được truy cập và do đó không được lưu trữ. Tôi cảm thấy ngay cả ý tưởng thiết lập cũng không phù hợp với tính chất tính toán bởi vì nếu bạn đặt nó không được tính toán.

Trong trường hợp thiết lập trong một thuộc tính, bạn biết khi nào nó được thiết lập hoặc gán và do đó không cần willSet hoặc didSet.

var myProp: String { 
    set { 
     //You know it is being set here. :-) 
     //No need of an event to tell you that! 
    } 
} 
1

Đối với các thuộc tính tính toán, người quan sát sẽ không thực sự thêm nhiều. Nó rất dễ dàng để làm tương đương trong hàm bộ như vậy:

set { 
    // do willSet logic here 
    let oldValue = a 

    a = newValue + 1 

    // do didSet logic here 
} 

Nếu willSet hoặc didSet logic là phức tạp, bạn có thể cấu trúc nó ra thành các hàm thành viên như willSetA hoặc didSetA.

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