Câu hỏi Cách sử dụng mã Objective-C với #define macro trong Swift


Tôi đang cố gắng sử dụng thư viện Objective-C của bên thứ ba trong một dự án Swift của tôi. Tôi đã nhập thư viện thành công vào Xcode và tôi đã thực hiện <Project>-Bridging-Header.h tệp cho phép tôi sử dụng các lớp Objective-C của tôi trong Swift.

Tôi dường như đang chạy vào một vấn đề tuy nhiên: mã Objective-C bao gồm một Constants.h tệp với macro #define AD_SIZE CGSizeMake(320, 50). Nhập Constants.h trong tôi <Project>-Bridging-Header.h không dẫn đến một hằng số toàn cầu AD_SIZE ứng dụng Swift của tôi có thể sử dụng.

Tôi đã làm một số nghiên cứu và thấy rằng tài liệu của Apple ở đây dưới "Macro phức tạp" nói rằng

“Trong Swift, bạn có thể sử dụng các hàm và generics để đạt được điều tương tự   kết quả [dưới dạng macro phức tạp] mà không có bất kỳ sự thỏa hiệp nào. Do đó,   các macro phức tạp trong các tệp nguồn C và Mục tiêu-C không được tạo   có sẵn cho mã Swift của bạn. "

Sau khi đọc xong, tôi đã làm cho nó hoạt động tốt bằng cách chỉ định let AD_SIZE = CGSizeMake(320, 50) trong Swift, nhưng tôi muốn duy trì tính tương thích trong tương lai với thư viện trong trường hợp các giá trị này thay đổi mà không cần tôi biết.

Có một sửa chữa dễ dàng cho điều này trong Swift hoặc tiêu đề bắc cầu của tôi? Nếu không, có cách nào để thay thế #define AD_SIZE CGSizeMake(320, 50) trong Constants.h và giữ mọi thứ tương thích ngược với mọi ứng dụng Objective-C hiện có sử dụng ứng dụng cũ AD_SIZE macro?


25
2018-06-10 05:45


gốc


Bạn đã thử sử dụng một static CGSize thay vì macro? - jtbandes
kiểm tra câu trả lời của tôi - Vineesh TP


Các câu trả lời:


Những gì tôi đã làm là tạo ra một phương thức lớp trả về #define.

Thí dụ:

.h tệp:

#define AD_SIZE CGSizeMake(320, 50)
+ (CGSize)adSize;

.m tệp:

+ (CGSize)adSize { return AD_SIZE; }

Và trong Swift:

Vì đây là một phương thức lớp, bây giờ bạn có thể sử dụng nó gần như bạn sẽ làm #define. Nếu bạn thay đổi macro #define của mình - macro sẽ được phản ánh theo phương pháp mới mà bạn đã tạo Trong Swift:

let size = YourClass.adSize ()


10
2017-11-03 06:45





Tôi đã giải quyết vấn đề này bằng cách thay thế

#define AD_SIZE CGSizeMake(320, 50)

trong thư viện Constants.h với

extern CGSize const AD_SIZE;

và thêm

CGSize const AD_SIZE = { .width = 320.0f, .height = 50.0f };

trong thư viện Constants.m tập tin.


5
2018-06-11 01:44





viết hằng số của bạn sau khi khai báo lớp. như thế này...

class ForgotPasswrdViewController: UIViewController {
let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1;
let Tag_iamTxtf = 101

4
2017-11-11 09:54



Ôi chúa ơi. Bạn có nghĩ rằng có một chiếc điện thoại cao 567,5 pixel không? Chỉ cần viết bounds.size.height == 568. Và nhận ra rằng macro của bạn bị đặt tên kém, vì iPod Touch hoặc iPhone 6/7 ở chế độ thu phóng có cùng chiều cao. - gnasher729
cảm ơn bạn @ gnasher729, bạn có thể chỉnh sửa câu trả lời của tôi. - Mohit tomar