2015-06-06 55 views
16

我在Swift中編寫了一個函數來檢測我點擊的是哪個六邊形。但我遇到了一個特殊的錯誤消息,指出我不能添加兩個CGFloats。無論我做了什麼,例如將let更改爲var,分別聲明並指定,不起作用。我想一定有其他的錯誤,但我找不到它。代碼如下:Swift二元運算符'+'不能應用於兩個CGFloat操作數

func pointToCoordinate(position: CGPoint) -> (Int, Int) { 
     var gridHeight = 2 * singleRadius/sqrt(CGFloat(3)) * 1.5 
     var gridWidth = 2 * singleRadius 
     var halfWidth = singleRadius 

     var relativePosition = CGPoint(x: position.x - totalRadius/2, y: position.y - totalRadius/2) 
     println((relativePosition.y/gridHeight)) 
     var row = -(cgfloatToInt)(relativePosition.y/gridHeight) 
     var column: Int 

     println((relativePosition.x + halfWidth * CGFloat(row + 1))/(gridWidth)) 
     column = cgfloatToInt((relativePosition.x + halfWidth * CGFloat(row + 1))/(gridWidth)) 

//  var innerY: CGFloat = CGFloat(relativePosition.y) + CGFloat(gridHeight * row) 
     var innerX = relativePosition.x 
     var innerY = relativePosition.y 

     innerY = innerY - CGFloat(gridHeight * row) 

     println((innerX, innerY)) 
     return (column, row) 
    } 

Error Message

回答

52

該錯誤消息錯誤。問題是,您正在嘗試乘以IntCGFloat

替換:

innerY = innerY - CGFloat(gridHeight * row) 

有:

innerY = innerY - gridHeight * CGFloat(row) 

上面的答案是你的代碼的當前版本。對於對應於您發佈錯誤消息的註釋版本:

替換:

var innerY: CGFloat = CGFloat(relativePosition.y) + CGFloat(gridHeight * row) 

var innerY: CGFloat = CGFloat(relativePosition.y) + gridHeight * CGFloat(row) 
+2

「錯誤信息是錯誤的」在Xcode 8/Swift 3中對於同樣的消息仍然非常相關。 –

+0

感謝它爲我工作。 :) – Chandni

2

事實上,還有別的東西錯了,這個工程:

import QuartzCore 

let a:CGFloat = 1 
let b:CGFloat = 2 

let c = a + b 
var innerY: CGFloat = CGFloat(1.0) + CGFloat(2.0) 

CGFloat實現FloatingPointType

0

後期加入。根據vacawama的回答,你們都知道問題不是相同的數據類型。
CGFloat有時需要多次寫入。我發現通過擴展更容易。所以分享一個答案。您可以創建一個如下所示的簡單擴展。當然,這個擴展可以進一步修改。

import CoreGraphics 
extension Int { 
    var cgf: CGFloat { return CGFloat(self) } 
    var f: Float { return Float(self) } 
} 

extension Float { 
    var cgf: CGFloat { return CGFloat(self) } 
} 

extension Double { 
    var cgf: CGFloat { return CGFloat(self) } 
} 

extension CGFloat { 
    var f: Float { return Float(self) } 
} 

現在我們可以寫

innerY = innerY - gridHeight * row.cgf 
1

翻翻所有的答案,鑄件,轉換和擴展,我認爲最好的辦法還沒有說對雨燕運算符重載。下面的雨燕3.0代碼示例:

/// overloads -/+ between a cgfloat on the left and an int/double on the right 
func - (left: CGFloat, right: Double) -> CGFloat { 
    return left - CGFloat(right); 
} 

func - (left: CGFloat, right: Int) -> CGFloat { 
    return left - CGFloat(right); 
} 

func + (left: CGFloat, right: Double) -> CGFloat { 
    return left + CGFloat(right); 
} 

func + (left: CGFloat, right: Int) -> CGFloat { 
    return left + CGFloat(right); 
} 

將這個變成一個全球性的地方任何類以外的。看到魔法發生。

相關問題