我正在为UIBezierPath创建一个自定义路径,而我正在获取"无法将类型值(CGFloat)分配给CGFloat类型的值。"我认为这是因为类型转换存在一些问题?我怎样才能解决这个问题?警告突然出现在" X =(b2-b1)/(m1-m2)"线和" Y = m1 * X + b1"线。
func lineIntersection(m1: CGFloat, b1: CGFloat, m2: CGFloat, b2: CGFloat, inout X: CGFloat, inout Y: CGFloat) -> Bool {
if m1 == m2 {
return false
} else if X = (b2 - b1)/(m1 - m2) {
return true
} else if Y = m1 * X + b1 {
return true
} else {
return false
}
}
我稍后会在另一个函数中调用此函数
func xxx() {
var outX = CGFloat()
var outY = CGFloat()
lineIntersection(oldSlope, b1: oldIntercept, m2: newSlope, b2: newIntercept, X: &outX, Y: &outY)
}
答案 0 :(得分:2)
斯威夫特并没有将“零”作为“假”"值,您需要与!= 0
中的if
明确比较。此外,将分配移动到单独的行,而不是将其作为条件的一部分。
除少数特殊情况外,浮点平等比较不可靠,而且不太可能是其中之一。
我会删除inout
个参数并返回一个可选的CGPoint
,即-> CGPoint?
。返回nil
的{{1}}和false
的{{1}}交叉点。
结果函数(我已经完全删除了相等性检查;浮点除零并不危险,我们可以稍后检查Inf / NaN):
CGPoint
在主叫地点使用会是这样的:
true
关于如何进行类型转换的文字问题(虽然这不是问题),你可以初始化基本类型"使用类似func lineIntersection(m1 m1: CGFloat, b1: CGFloat, m2: CGFloat, b2: CGFloat) -> CGPoint? {
let x = (b2 - b1) / (m1 - m2)
let y = m1 * x + b1
return y.isFinite ? CGPoint(x: x, y: y) : nil
}
的内容,通过"创建"来生成类型转换来自if let intersection = lineIntersection(m1: m1, b1: b1, m2: m2, b2: b2) {
// use intersection.x and intersection.y
}
的新CGFloat(value)
。有几种类型还有其他方法来指定转换的确切程度,例如CGFloat
原样取最低32位,而value
如果上溢或下溢则会崩溃。这样的转换是使用Int32(truncatingBitPattern: largerInteger)
(已知在编译时成功),Int32(largerInteger)
(尝试在运行时进行转换,失败时为as
),as?
(尝试在运行时进行转换)断言成功)。