如何在Swift中进行Typecast?

时间:2015-07-31 16:31:11

标签: ios swift casting cgfloat

我正在为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)
}

1 个答案:

答案 0 :(得分:2)

  1. 斯威夫特并没有将“零”作为“假”"值,您需要与!= 0中的if明确比较。此外,将分配移动到单独的行,而不是将其作为条件的一部分。

  2. 除少数特殊情况外,浮点平等比较不可靠,而且不太可能是其中之一。

  3. 我会删除inout个参数并返回一个可选的CGPoint,即-> CGPoint?。返回nil的{​​{1}}和false的{​​{1}}交叉点。

  4. 结果函数(我已经完全删除了相等性检查;浮点除零并不危险,我们可以稍后检查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?(尝试在运行时进行转换)断言成功)。