2015-03-31 23 views
7

Tôi đang học Swift.Cách sử dụng kết buộc Cocoa đối với các cấu trúc Swift

Tôi chủ yếu làm việc trong iOS những ngày này, nhưng tôi hiện đang làm việc trên một dự án nhỏ cho OS X.

Ngày OSX Tôi thích sử dụng các ràng buộc Cocoa để liên kết các giá trị từ mô hình của tôi đến các yếu tố giao diện người dùng. Nó tiết kiệm bằng văn bản tấn mã keo.

Tôi đang viết một chương trình so sánh hiệu suất của Swift với C/Objective-C. Tôi đang sử dụng trình tạo số nguyên tố làm dự án thử nghiệm.

Tôi đã tạo một Swift Struct ComputeSettings đóng gói các thiết lập (và kết quả) để chạy trình tạo số nguyên tố trong cả Swift và Objective-C. Các struct trông như thế này:

struct ComputeResults 
{ 
    var totalCalculated: Int = 0 
    var primesPerSecond: Int = 0 
    var totalTime:  NSTimeInterval = 0 
} 
struct ComputeSettings 
{ 
    var totalToCalculate: Int = 10000000 
    var swiftResults:  ComputeResults = ComputeResults() 
    var objCResults:  ComputeResults = ComputeResults() 
} 

sau đó tôi có một biến thể hiện của loại ComputeSettings trong điều khiển điểm của tôi:

class ViewController: NSViewController 
{ 
    var theComputeSettings = ComputeSettings() 
    var foo: Int = 12 
    //... 
} 

Trong giao diện người dùng của tôi, tôi có một trường văn bản cho phép người dùng nhập vào số lượng số nguyên tố để tính. Trong IB, tôi chọn trường, chọn tab bindings trong khu vực tiện ích, sau đó mở các giá trị bindings. Tôi liên kết với lớp học ViewController của tôi. Tôi nhập đường dẫn khóa mô hình là self.theComputeSettings.totalToCalculate.

Khi tôi chạy dự án của tôi nó không có một ngoại lệ:

Không thể thiết lập (contentViewController) người dùng định nghĩa kiểm tra tài sản trên (NSWindow): [addObserver: forKeyPath: @ tùy chọn "theComputeSettings.totalToCalculate" : 256 ngữ cảnh: 0x0] đã được gửi đến một đối tượng không tuân thủ KVC đối với thuộc tính "theComputeSettings" "theComputeSettings".

Nếu, thay vào đó, tôi liên kết với thuộc tính giả foo (vì vậy đường dẫn khóa mô hình được đặt thành self.foo) hoạt động hoàn hảo. Trong trường hợp đó, tôi thấy trường văn bản của tôi hiển thị giá trị của tôi là 12.

Có cách nào để sử dụng cấu trúc Swift và vẫn nhận được ràng buộc Cocoa để hoạt động không? Tôi đã làm một số tiền hợp lý của googling, nhưng không thể tìm thấy bất cứ điều gì.

Tôi chắc chắn có thể làm theo cách thủ công, và viết một bó mã keo để cài đặt giá trị của tôi từ cấu trúc của tôi vào khung nhìn cửa sổ của tôi, nhưng tôi muốn sử dụng nhiều ràng buộc Cocoa. Đó là những gì họ đang cho.

Trả lời

9

Bạn không thể sử dụng kết buộc Cocoa với cấu trúc Swift.

Hệ thống kết buộc cacao được thực hiện ở phía trên Quan sát giá trị-khóa và Quan sát giá trị khóa được thực hiện bằng cách tạo một lớp con để chặn các thông báo set<Property>: được gửi đến đối tượng quan sát được. Các cấu trúc Swift không thể có các lớp con và không nhất thiết phải sử dụng các thông điệp hoặc các cuộc gọi hàm để thiết lập các trường struct, vì vậy không có cách nào nói chung để ngăn chặn thiết lập của một trường struct Swift.

Tin nhắn than phiền về việc thiếu tuân thủ KVC vì Mã hóa khóa-giá trị xác định quy ước set<Property>: (và <property> getter) cho tên tin nhắn.

+0

Vâng poo. Điều này có vẻ như là một hạn chế nghiêm trọng.Nó sẽ có thể thực hiện các loại trên các giá trị nguyên thủy trong các cấu trúc và/hoặc trên bản thân các bản vẽ để ánh xạ một phương thức didSet nhanh chóng để gọi một phương thức thiết lập tuân thủ KVO? Tôi đang ở giữa viết 500 lbs. của mã keo để đọc/hiển thị các giá trị cho các trường của tôi. Liên kết cacao là một trong những điều tốt hơn về phát triển OS X. Tôi thực sự muốn sử dụng chúng nhiều hơn, ngay cả khi nó có nghĩa là làm một số vật nặng lên phía trước. –

+0

Tại sao ComputeResults cần phải là một cấu trúc? Nó thực sự là một phần của mã bạn đang lược tả? –

+0

Nó không có ** cấu trúc. Nó dường như là cách sạch nhất để đại diện cho dữ liệu. Tôi đoán tôi sẽ thay đổi nó thành một đối tượng dữ liệu tùy chỉnh, vì các thuộc tính trên các đối tượng phải tuân thủ KVO, phải không? –

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