2014-06-30 21 views
10

Tôi đang cố dịch một số mã mục tiêu C thành Swift. Tôi đã thêm Cocoapod "Masonry" cho Autolayout vào dự án của tôi và thêm một Bridging-Header để có thể sử dụng Objective-C Methods trong Swift.Dịch ObjC-Blocks sang Swift đóng cửa

này Phương pháp ObjC:

[_tableView mas_makeConstraints:^(MASConstraintMaker *make) { 
    make.edges.equalTo(self.view); 
}]; 

nên một cái gì đó giống như Đóng cửa sau:

tableView.mas_makeConstraints({ (make : MASConstraintMaker!) -> Void? in 
    make.edges.equalTo(self.view) 
}) 

Nhưng tôi nhận được một "không thể tìm thấy thành viên 'mas_makeConstraints'" mà không phải là lỗi, vì phương pháp được lập chỉ mục và tự động điền cho tôi những điều sau:

tableView.mas_makeConstraints(block: ((MASConstraintMaker!) -> Void)?) 

?!

Tôi có làm gì sai ở đây không?

Trả lời

6

này mảnh ở đây trong phương pháp chữ ký:

(block: ((MASConstraintMaker!) -> Void)?) 

... đang nói với bạn rằng blockluận là bắt buộc, không phải là giá trị trở, mà nên Void (khôngVoid? , nơi bạn viết (make: MASConstraintMaker!) -> Void?)

cũng: vì Swift Type Inferenc e bạn không cần phải đặt các loại trong khối

cũng có thể là: vì Swift Trailing Closures bạn không cần phải đóng một đối số cuối cùng cho một phương thức bên trong danh sách đối số trong parens (và từ đây nó là đối số duy nhất, bạn có thể rời khỏi parens hoàn toàn)

như vậy thực sự toàn bộ cuộc gọi phương pháp của bạn với lập luận khối có thể được viết lại như sau:

tableView.mas_makeConstraints { make in 
    make.edges.equalTo(self.view) 
} 

cuối cùng: có vẻ giống như phương pháp thể hiện bạn đang gọi o n make.edges trả về một khối và nhờ tính năng tiện lợi Swift của 'trả về tiềm ẩn của các khối biểu thức đơn' có thể là trường hợp khối của bạn đang hoàn trả về giá trị của biểu thức đó khi mong đợi Void - vì vậy cuối cùng , nếu ở trên không hoạt động bạn có thể vẫn cần phải trả lại một cách rõ ràng Void bằng cách viết lời gọi phương thức của bạn như:

tableView.mas_makeConstraints { make in 
    make.edges.equalTo(self.view) 
    return() 
} 
+1

Cảm ơn lời giải thích tốt.Điều này thực sự hoạt động, nhưng bây giờ tôi đang gặp lỗi: Không thể chuyển đổi loại biểu thức '$ T5' thành loại '() -> ((AnyObject!) -> MASConstraint!)!' Bất kỳ ý tưởng nào? – user3791103

+5

thử make.edges.equalTo() (self.view) – skorulis

+0

Mỏ vẫn không hoạt động nhưng ... @skorulis đã trả lời. Vì vậy, nhầm lẫn tại sao mặc dù ...! – dineth

21

Chỉ cần tôi 2 cent nếu có ai gặp trường hợp này:

objc này

[productView mas_makeConstraints:^(MASConstraintMaker *make) { 
    make.left.equalTo(self.view.mas_left).with.offset(15); 
    make.right.equalTo(self.view.mas_right).with.offset(15); 
    make.top.equalTo(self.view.mas_top).with.offset(15); 
    make.height.equalTo(productView.mas_width); 
}]; 

sẽ chuyển thành

productView.mas_makeConstraints{ make in 
    make.left.equalTo()(self.view.mas_left).with().offset()(15) 
    make.right.equalTo()(self.view.mas_right).with().offset()(-15) 
    make.top.equalTo()(self.view.mas_top).with().offset()(15) 
    make.height.equalTo()(productView.mas_width) 
    return() 
} 
Các vấn đề liên quan