2014-10-22 21 views
8

Có cách nào để tự động tạo cặp hàm getter/setter cho một thuộc tính trong một lớp trong Swift không? Một cái gì đó dọc theo đường ống kính trong Haskell.Lenses vào thuộc tính Swift

tôi đã có thể làm như sau tay:

class PropertyLens<U, T> { 
    let getter: U -> T 
    let setter: (U, T) ->() 

    init(getter: (U -> T), setter: ((U, T) ->())) { 
     self.getter = getter 
     self.setter = setter 
    } 

    func get(u: U) -> T { 
     return getter(u) 
    } 

    func set(u: U, t: T) { 
     setter(u, t) 
    } 
} 
// ... 
let myPropertyLens = PropertyLens<MyClass, Int>(getter: { $0.myProperty }, setter: { $0.myProperty = $1 }) 

Tuy nhiên, điều đó trở thành verbose, tẻ nhạt, và nhiều hơn nữa dễ bị lỗi hơn tôi muốn. Có tính năng tích hợp nào mà tôi đang thiếu không?

+1

Mục tiêu của bạn là gì? Nhiều như tôi hiểu chúng, ống kính trong Haskell được thiết kế để cho phép trạng thái có thể thay đổi, mà Swift bao gồm rồi. Giữa các trình xử lý 'willSet' và' didSet' và các thuộc tính được tính toán, có rất nhiều tính linh hoạt. –

+3

Mục tiêu của tôi là có thể truyền thấu kính này vào một đối tượng khác để thao tác các thuộc tính. Trong dự án hiện tại của tôi, nó là một đối tượng tạo ra các ô xem bảng và phản hồi các lần nhấn theo cách tiêu chuẩn. Ống kính trong Haskell không phải là về trạng thái có thể thay đổi nhiều như chúng cung cấp một cách tổng hợp để truy vấn và thao tác các cấu trúc dữ liệu, mặc dù ảo ảnh về sự biến đổi xuất hiện từ chúng. –

+0

Cách ObjC sẽ chỉ vượt qua một đường phím chuỗi nhưng bạn không có loại an toàn –

Trả lời

0

Đối với câu trả lời, cho đến nay (1.1) không có cấu trúc ngôn ngữ nào sẽ thay thế những gì bạn đang làm (bao gồm quá trình truy cập của một thuộc tính được lưu trữ vào đối tượng tham chiếu).

Đối với phần ý kiến ​​của câu trả lời, có vẻ như mã của bạn chỉ hoạt động với các biến công khai, điều khó chịu khi chúng phá vỡ các quy tắc đóng gói cơ bản, đúng không?

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