2014-10-19 14 views
6

Ví dụ, tôi muốn gọi một phương thức trên một cá thể lớp sẽ thêm willSet vào một thuộc tính. Tôi không muốn chỉ định willSet trong khai báo thuộc tính, vì tôi cần thêm logic có điều kiện trong trình quan sát và sẽ chạy không cần thiết cho mọi cá thể khác không có phương thức này được gọi.Người quan sát thuộc tính có thể được thêm sau tuyên bố ban đầu không? Ví dụ:

Something như thế này:

var someProperty: Int 

func someMethod() { 
    someProperty { // this is the syntax/ability I'm unsure about 
     willSet { ...add some behavior... } 
    } 

    ...more stuff... 
} 

Trả lời

3

Một người quan sát có thể được thêm vào bất động sản tuyên bố trong một lớp cha, nhưng không phải trong cùng một lớp hoặc trong một phần mở rộng lớp. Bạn không thể khai báo cùng một thuộc tính ở hai vị trí trong một hàm. Giải pháp tốt nhất tôi có thể đưa ra là một cái gì đó như thế này, nơi bạn có một đóng cửa tùy chọn mà bạn đánh giá trong willSet, và bạn chỉ gán một cái gì đó cho thuộc tính đó khi bạn muốn hành vi quan sát.

có lẽ cái gì đó như:

private var _willSetCallback: ((Int) -> (Bool))? 
var someProperty: Int { 
    willSet { 
     if let optionalBool = _willSetCallback?(newValue) { 
      // do something 
     } 
    } 
} 

func someMethod() { 
    self._willSetCallback = { newValue in 
    return newValue > 0 
    } 
} 

Nó không phải là đặc biệt là thanh lịch, nhưng nó có thể nhiều hơn hoặc ít hơn xử lý các hành vi mà bạn mong muốn?

+1

Ah, do đó, nó không phải là một tính năng bản địa theo cách tôi đã hỏi về. Giải pháp này không nhận được xung quanh hai vấn đề tôi đã quan tâm về: Mỗi trường hợp sẽ phải chạy 'willSet' và điều kiện kết quả bên trong nó. Tôi đã hy vọng cho một cách để có trường hợp không có 'willSet' ở tất cả, trừ khi họ đã thêm rằng quan sát tại một số điểm sau này. – solidcell

+0

Bạn có quan tâm đến hiệu suất không? Bởi vì Trong ví dụ trên, bạn sẽ chỉ thực hiện mã nếu đóng tùy chọn không phải là nil và kiểm tra xem việc đóng! = Nil có phân nhánh hiệu suất không đáng kể không. – cmyr

+2

Đó là một phần để khám phá ngôn ngữ. Tuy nhiên, như một ví dụ, tôi đang suy nghĩ về một trường hợp mà tôi muốn thêm một phần mở rộng đóng gói một số logic và người quan sát thuộc tính đó nên được nhóm lại trong cùng một phần mở rộng đó. – solidcell

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