2016-08-31 12 views
38

Trong dự án của tôi, sau khi chuyển đổi để nhanh chóng 3, một chức năng mới xuất hiện trước lớp ViewController tôi:Strange hàm tổng quát xuất hiện trong quan điểm điều khiển sau khi chuyển đổi để nhanh chóng 3

fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool { 
    switch (lhs, rhs) { 
    case let (l?, r?): 
    return l < r 
    case (nil, _?): 
    return true 
    default: 
    return false 
    } 
} 

không chức năng này làm gì? Tại sao tôi cần nó?

Trả lời

44

Điều đó thật thú vị. Trước nhất Swift 3, bạn có thể so sánh tùy chọn giá trị, ví dụ

let a: Int? = nil 
let b: Int? = 4 

print(a < b) // true 

nil được coi là ít hơn tất cả các giá trị phi tùy chọn.

tính năng này đã bị xóa (SE-0121 – Remove Optional Comparison Operators) và mã trên sẽ không biên dịch trong Xcode 8 beta 6 với

 
error: value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'? 

Rõ ràng, migrator Swift giải quyết vấn đề đó cho bạn bằng cách cung cấp một tùy chỉnh < nhà điều hành có hai toán hạng tùy chọn và do đó "khôi phục" hành vi cũ.

Nếu bạn loại bỏ định nghĩa đó, bạn sẽ thấy nơi việc so sánh được thực hiện trong mã của bạn. Sau đó, hãy thử cập nhật mã của bạn và xóa các so sánh tùy chọn.

+0

Vì vậy, về cơ bản có nghĩa là trong hầu hết các trường hợp, tôi chỉ có thể xóa nó? Tôi không cần phải so sánh nil với các tùy chọn. –

+11

@BrightFuture: Theo kinh nghiệm của tôi, Xcode bổ sung thêm rằng chỉ khi nó cần ở đâu đó. Hãy thử loại bỏ nó và xem những gì sẽ xảy ra. –

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