2017-06-20 27 views
6

Tôi có đoạn code sau trong dự án của tôi trong Xcode 8.3.3 (Swift 3.1):Swift 4 tương thích ngược

let font = CGFont(provider!) 
CTFontManagerRegisterGraphicsFont(font, &error) 

Nhưng trong Xcode 9 Beta (Swift 4), tôi nhận được lỗi sau:

Value of optional type 'CGFont?' not unwrapped; did you mean to use '!' or '?'?

Lỗi là do initializer for CGFont mất CGDataProvider hiện trả về tùy chọn.

Nhưng khi tôi áp dụng các sửa chữa của:

let font = CGFont(provider) 
CTFontManagerRegisterGraphicsFont(font!, &error) 

Mã này không còn biên dịch trong Xcode 8.3.3 với Swift 3.1 từ phông chữ không phải là một tùy chọn và do đó không chơi độc đáo với !.

Có cách nào để thực hiện công việc này trong cả hai phiên bản của Xcode? Swift 4 có phải là tương thích ngược hay không (biên dịch với trình biên dịch Swift 3)?

+0

Tôi muốn nói đây là một thay đổi đột phá trong Core Graphics (initializer đã trở thành failable), vì vậy nó không liên quan gì đến Swift 4. Nhưng tôi nghĩ bạn có thể sử dụng trình biên dịch có điều kiện để giải quyết vấn đề này. –

Trả lời

4

tôi đã kết thúc bằng cách sử dụng phương pháp sau đây cho phép để tương thích ngược mà không cần biên soạn có điều kiện (ý tưởng lấy từ this blog post):

func optionalize<T>(_ x: T?) -> T? { 
    return x 
} 

Bằng cách này trong cả hai Xcode 8 và Xcode 9 tôi có thể sử dụng:

guard let font = optionalize(CGFont(provider)) else { 
    return 
} 
CTFontManagerRegisterGraphicsFont(font, &error) 
+1

Nó đau khổ để upvote này, nhưng tôi upvoting này. –

7

Đây là thay đổi đột phá trong Đồ họa lõi không có trong chính Swift. API đã thay đổi, trình khởi tạo hiện có sẵn.

Sử dụng conditional compilation để làm cho mã của bạn biên dịch với cả 3.1 và 4.0 trình biên dịch:

#if swift(>=4.0) 
let font = CGFont(provider!) 
#else 
let font = CGFont(provider)! 
#endif 

CTFontManagerRegisterGraphicsFont(font, &error) 
+0

Nếu tôi sử dụng điều này thì tôi nhận thấy ngay cả trong Xcode 9 tôi đã nhấn trường hợp 'khác'. Vì vậy, tôi đã đi đến cài đặt dự án của tôi và thay đổi 'Swift Language Version' thành Swift 4.0. Nhưng bây giờ một lần nữa nếu tôi mở trong Xcode 8 thì nó phàn nàn về một phiên bản nhanh chóng không được hỗ trợ ... –

+0

@AdamJohns Có lẽ vấn đề là trình biên dịch mới vẫn còn trong phiên bản beta, vì vậy nó có thể có một phiên bản như 4.0.beta ... Thử thay đổi phiên bản trong câu lệnh biên dịch có điều kiện thành 3.3 (hoặc phiên bản 3.x không tồn tại khác). Hoặc, để tránh đoán, hãy chạy 'swiftc --version' là một trong các kịch bản lệnh xây dựng để xem phiên bản chính xác của trình biên dịch Swift trong Xcode 9 và 8.3. Có thể Xcode 9 sử dụng phiên bản cũ hơn của các công cụ dòng lệnh (kiểm tra tab Vị trí trong cài đặt Xcode). –

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