2014-06-10 23 views
10

Tương đương với mã Mục tiêu-C sau trong Swift là gì?Tạo đối tượng Getter và Setter tương đương trong Swift

@property (nonatomic, assign, getter = isOpen) BOOL open; 

Cụ thể, cách khai báo biến trong Swift để tổng hợp trình lấy bằng tên tùy chỉnh?

Hơn nữa, làm cách nào để bạn có thể ghi đè lên việc triển khai trình gỡ rối và thiết lập?

+7

Tôi nghĩ rằng bạn thực sự cần phải đọc cuốn sách của Apple trên Swift. Nó miễn phí! – ColinE

+8

@ColinE: trả lời khoảng 50% câu hỏi trong [tag: swift-language] – 68cherries

+2

Tôi sẽ khuyến khích những cử tri thân thiết đọc thảo luận ở đây. http://meta.stackexchange.com/questions/86043/introduce-a-general-reference-close-reason – jtbandes

Trả lời

17

Giả định của bạn đã đóng, nhưng một vài điều có thể thay đổi. Tôi sẽ cố gắng giúp bạn đến gần với phiên bản Objective-C nhất.

Trước hết, nonatomicassign không liên quan nhanh chóng. Điều đó để lại cho chúng tôi

@property (getter = isOpen) BOOL open; 

Vì thuộc tính nhanh chóng chỉ là các biến mẫu, bản dịch nhanh chóng sẽ như sau.

var open:Bool 

Mặc dù chức năng cơ bản này giống với phiên bản Mục tiêu-C, thiếu bộ đặt tên (isOpen). Thật không may, không có bản dịch trực tiếp để nhanh chóng cho điều này (chưa). Bạn có thể sử dụng một getter tùy chỉnh và setter.

var open:Bool { 
    get { 
     // custom getter 
    } 
    set { 
     // custom setter 
    } 
} 

Một tác phẩm khá thô xung quanh sẽ làm cho khác chức năng theo nghĩa đen gọi isOpen đó sẽ hoạt động như một getter.

func isOpen() -> Bool { return self.open } 

Tóm lại, những gì bạn đang yêu cầu chỉ hơi có thể, nhưng hy vọng sau này có thể trở thành hiện thực.

+1

Điều này sẽ phổ biến hơn nhiều khi Swift nhận được cơ chế kiểm soát truy cập (họ đã được [hứa bởi nhóm Swift] (https://devforums.apple.com/thread/227288?start=0&tstart=0)). – Erik

+0

Cảm ơn bạn. Nó có ý nghĩa bây giờ – mike

+2

Một getter được đặt tên được viết: 'var isOpen: Bool {get {}}' và nếu bạn muốn sử dụng setter 'var isOpen: Bool {set {} get {}}' - bất cứ khi nào một giá trị được thiết lập nó được chuyển tới setter như 'newValue' - cũng lưu ý rằng thuộc tính phải có kiểu khai báo trong cả hai trường hợp – sketchyTech

15
var open: Bool { 
    @objc(isOpen) 
    get { 
     // custom getter 
    } 
    set { 
     // custom setter 
    } 
} 

Dẫn đến tiêu đề tạo này:

SWIFT_CLASS("_TtC11SwiftToObjC9TestClass") 
@interface TestClass : NSObject 
@property (nonatomic, getter=isOpen) BOOL open; 
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; 
@end 
+0

Không đáng để thực hiện cùng một hành vi cho người thiết lập bằng cách di chuyển dòng '@objc ()' phía trên dòng 'set'. Vì nó là một setter, nó đòi hỏi một tham số, vì vậy bạn cũng sẽ cần một ':' sau tên setter. –

+0

Không làm việc cho tôi :(, liều không xuất hiện trong danh sách getter khi tôi cố gắng để có được getter từ lớp nhanh chóng unsigned int propertyCount = 0; objc_property_t * properties = class_copyPropertyList ([đối tượng lớp], & propertyCount); NSDictionary * Thông tin = [self getObjectInfoWithProperties: properties propertyCount: propertyCount]; NSMutableArray * propertyGetters = [info objectForKey: @ "propertyGetters"]; –

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