二元运算符“+”不能应用于两个 CGFloat 操作数?
Binary operator '+' cannot be applied to two CGFloat operands?
在 Swift 中编码并得到上述错误...
消息是否掩盖了其他内容,或者您真的不能添加两个 CGFloat 操作数吗?如果不是,为什么(究竟)不是?
编辑
我尝试编写的代码没有什么特别之处;有趣的是,上面的错误消息 VERBATIM 是 Swift 助理编译器告诉我的(用红色波浪线在我的代码下划线)。
运行 Xcode 6.3 (Swift 1.2)
绝对有可能,使用二元运算符“+”添加两个 CGFloat 变量。你需要知道的是结果变量也是一个CGFloat变量(基于类型推理原理)。
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.
编辑:
通过 Swift v3.0 约定
let value = CGFloat(12.0) + CGFloat(13.0)
println("value \(value)")
//The result is value 25.0, and the value is of type CGFloat.
我 运行 使用这段看起来无辜的代码:
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)
// ~~~~~~ ^ ~~~~~~~
}
并通过展开问题导航器中的错误找到了解决方案:
仔细研究,我认为 Swift 首先根据其 return 类型找到了 +(lhs: Float, rhs: Float) -> Float
函数(ceilf
接受 Float
)。显然,这需要 Float
秒,而不是 CGFloat
秒,这在一定程度上阐明了错误消息的含义。因此,要强制它使用正确的运算符,您必须使用包装函数,该函数采用 a Double
或 a Float
(或者只是一个 CGFloat
,很明显)。 所以我试了一下,错误解决了:
// ...
let height = ceilf(Float(ascent + descent))
// ...
另一种方法是使用接受 Double
或 CGFloat
:
的函数
// ...
let height = ceil(ascent + descent)
// ...
所以问题是 编译器优先考虑 return 类型而不是参数类型。 很高兴看到这种情况仍在 Swift 3 中发生;P
造成这种错误的原因主要有两种。
第一:
每当您尝试比较可选类型 CGFloat 变量时
喜欢
if a? >= b?
{
videoSize = size;
}
这是造成错误的原因,所以只需将其设为 if a! >= b!{}
第二个:
每当您当时直接使用值来获得结果时,就会发生这种错误
喜欢
var result = 1.5 / 1.2
不要像上面那样使用。
与声明为 CGFloat
的对象一起使用
喜欢
var a : CGFloat = 1.5
var b : CGFloat = 1.2
var result : CGFloat!
result = a / b
在 Swift 中编码并得到上述错误...
消息是否掩盖了其他内容,或者您真的不能添加两个 CGFloat 操作数吗?如果不是,为什么(究竟)不是?
编辑
我尝试编写的代码没有什么特别之处;有趣的是,上面的错误消息 VERBATIM 是 Swift 助理编译器告诉我的(用红色波浪线在我的代码下划线)。
运行 Xcode 6.3 (Swift 1.2)
绝对有可能,使用二元运算符“+”添加两个 CGFloat 变量。你需要知道的是结果变量也是一个CGFloat变量(基于类型推理原理)。
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.
编辑: 通过 Swift v3.0 约定
let value = CGFloat(12.0) + CGFloat(13.0)
println("value \(value)")
//The result is value 25.0, and the value is of type CGFloat.
我 运行 使用这段看起来无辜的代码:
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)
// ~~~~~~ ^ ~~~~~~~
}
并通过展开问题导航器中的错误找到了解决方案:
仔细研究,我认为 Swift 首先根据其 return 类型找到了 +(lhs: Float, rhs: Float) -> Float
函数(ceilf
接受 Float
)。显然,这需要 Float
秒,而不是 CGFloat
秒,这在一定程度上阐明了错误消息的含义。因此,要强制它使用正确的运算符,您必须使用包装函数,该函数采用 a Double
或 a Float
(或者只是一个 CGFloat
,很明显)。 所以我试了一下,错误解决了:
// ...
let height = ceilf(Float(ascent + descent))
// ...
另一种方法是使用接受 Double
或 CGFloat
:
// ...
let height = ceil(ascent + descent)
// ...
所以问题是 编译器优先考虑 return 类型而不是参数类型。 很高兴看到这种情况仍在 Swift 3 中发生;P
造成这种错误的原因主要有两种。
第一:
每当您尝试比较可选类型 CGFloat 变量时 喜欢
if a? >= b?
{
videoSize = size;
}
这是造成错误的原因,所以只需将其设为 if a! >= b!{}
第二个: 每当您当时直接使用值来获得结果时,就会发生这种错误
喜欢
var result = 1.5 / 1.2
不要像上面那样使用。
与声明为 CGFloat
喜欢
var a : CGFloat = 1.5
var b : CGFloat = 1.2
var result : CGFloat!
result = a / b