2016-03-03 12 views
7

Nhóm của tôi đã quyết định rằng các tệp mới nên được viết nhanh chóng và tôi thấy có vấn đề với việc sử dụng KVC trong đối tượng Objective-C để đặt thuộc tính trên đối tượng Swift.Tại sao tôi không thể sử dụng KVC từ đối tượng Objective-C đến thuộc tính Swift?

My Objective-C lập một tài sản như sau: [textObject setValue:0.0 forKey:@"fontSize"]

đối tượng Swift của tôi (textObject) có một phong tục setter/getter cho thuộc tính này.

var fontSize: CGFloat? { 
     get { 
     return internalTextGraphic?.fontSize 
     } 
     set { 
      internalTextGraphic?.fontSize = newValue 
     } 
    } 

Tuy nhiên, nếu tôi đặt điểm ngắt trong set, nó sẽ không bao giờ bị trúng.

Tôi có đối tượng mục tiêu-C cũng nhận được cùng một cuộc gọi này và tôi chỉ triển khai -setFontSize và việc thực thi được nhập đúng cách.

Tại sao tôi không thể chuyển sang phương thức set của mình thông qua -setValueForKey? Tôi đã xác nhận 100% số textObject tồn tại và là loại chính xác.

EDIT:
Martin R là chính xác, tôi phải đặt loại không bắt buộc. Đây là mã làm việc của tôi:

var fontSize: CGFloat { 
     get { 
     var retFontSize: CGFloat = 0.0 
     if let fontSize = internalTextGraphic?.fontSize { 
      retFontSize = fontSize 
     } 
     return retFontSize 
     } 
     set { 
     if let textGraphic = internalTextGraphic { 
      textGraphic.fontSize = newValue 
     } 
     } 
    } 

Trả lời

8

Lý do là một tùy chọn Swift struct hoặc enum (trong trường hợp của bạn CGFloat?) không phải là biểu diễn trong Objective-C (và bạn sẽ không thấy bất động sản trong tạo "Project-Swift.h" tệp tiêu đề). Đó là trở nên rõ ràng hơn nếu bạn đánh dấu tài sản một cách rõ ràng với @objc, sau đó bạn sẽ nhận được thông báo lỗi

 
error: property cannot be marked @objc because its type cannot be represented in Objective-C 

Nếu bạn thay đổi kiểu thuộc tính vào không bắt buộc CGFloat sau đó KVC công trình như mong đợi. Nó cũng sẽ hoạt động với loại lớp tùy chọn , chẳng hạn như NSNumber?.

+1

* "tùy chọn Swift không thể đại diện trong Objective-C" * - tốt, điều này không đúng đối với các loại lớp/giao thức tùy chọn, nhưng nó đúng với cấu trúc/enums, trong đó CGFloat là một. – jtbandes

+0

@jtbandes: Bạn đúng, cố định - cảm ơn! –

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