2015-02-23 22 views
21

Mã hóa bằng Swift và nhận được lỗi ở trên ...Toán tử nhị phân '+' không thể áp dụng cho hai toán hạng CGFloat?

Thư có che dấu gì khác HOẶC bạn có thực sự không thêm hai toán hạng CGFloat không? Nếu không, tại sao (trên trái đất) không?

EDIT

Có gì đặc biệt trong mã Tôi đang cố gắng làm là; Điều thú vị là thông báo lỗi trên, VERBATIM, là những gì trình biên dịch trợ lý Swift nói với tôi (gạch chân mã của tôi với các đường kẻ nguệch ngoạc màu đỏ).

Chạy Xcode 6.3 (Swift 1.2)

+2

Chắc chắn bạn có thể. - Một ví dụ mã (nhỏ, khép kín) thể hiện vấn đề của bạn sẽ vô cùng hữu ích ... –

+0

Tôi cũng gặp lỗi tương tự, lý do có thể là gì? – sasquatch

Trả lời

23

Hoàn toàn có thể, thêm hai biến CGFloat bằng toán tử nhị phân '+'. Những gì bạn cần biết là biến kết quả cũng là một biến CGFloat (dựa trên kiểu Nguyên tắc suy luận).

let value1 : CGFloat = 12.0 
let value2 : CGFloat = 13.0 
let value3 = value1 + value2 
println("value3 \(value3)") 

//The result is value3 25.0, and the value3 is of type CGFloat. 

EDIT: Theo quy ước v3.0 Swift

let value = CGFloat(12.0) + CGFloat(13.0) 
println("value \(value)") 

//The result is value 25.0, and the value is of type CGFloat. 
+0

Cảm ơn. Bạn vừa xác nhận rằng tôi sẽ không phát điên. – Sam

+9

Apple cần phải tạo ra '' '' '' '' và '' '' '' '' '' '' '' 'và' '' '', chơi với nhau, hoặc tìm ra một thư viện hình học hoàn toàn mới dựa trên các kiểu gốc của swift. Cho đến lúc đó, làm cho việc di chuyển nhanh chóng là một PITA thực sự. –

4

Tôi chạy vào này sử dụng mảnh vô tội-tìm mã này:

func foo(line: CTLine) { 
    let ascent: CGFloat 
    let descent: CGFloat 
    let leading: CGFloat 
    let fWidth = Float(CTLineGetTypographicBounds(line, &ascent, &descent, &leading)) 
    let height = ceilf(ascent + descent) 
    //     ~~~~~~^~~~~~~~ 
} 

Và tìm thấy giải pháp bằng cách mở rộng lỗi trong Bộ điều hướng phát hành: Expanding the error, revealing "Expected an argument list of type '(Float, Float)'"

Nhìn vào nó, tôi nghĩ Swift tìm thấy hàm +(lhs: Float, rhs: Float) -> Float đầu tiên dựa trên kiểu trả về của nó (ceilf mất một Float). Rõ ràng, điều này mất Float s, không phải CGFloat s, làm sáng tỏ một số ý nghĩa của thông báo lỗi. Vì vậy, để ép buộc sử dụng toán tử phù hợp, bạn phải sử dụng hàm bao bọc phải mất hoặc a DoublehoặcFloat (hoặc chỉ là CGFloat). Vì vậy, tôi đã cố gắng này và các lỗi đã được giải quyết:

// ... 
    let height = ceilf(Float(ascent + descent)) 
    // ... 

cách tiếp cận khác sẽ được sử dụng một chức năng mà phải mất một Double hoặc CGFloat:

// ... 
    let height = ceil(ascent + descent) 
    // ... 

Vì vậy, vấn đề là các ưu tiên biên dịch trả về các kiểu trên các kiểu tham số. Vui mừng khi thấy điều này vẫn xảy ra trong Swift 3; P

+1

Tôi chạy vào một cái gì đó tương tự. Sử dụng phương pháp toán học cũ với dấu 'f' đã làm điều này. Nếu bạn làm 'round' thay vì' roundf' chẳng hạn, điều này sẽ biến mất. –

+1

Vâng, vẫn xảy ra trong Swift 3. Thông báo lỗi Cấp độ: Amateur. –

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