【问题标题】:Swift 5 calling squareRoot()Swift 5 调用 squareRoot()
【发布时间】:2019-05-15 09:43:32
【问题描述】:

我正在阅读 Swift 4 for Beginners。我正在制作素数检查器,并希望使用squareRoot() 函数在除法之前获取平方根以检查素数。

这是我的代码:

 func isPrime(_ number: Int) -> Bool {
    switch number {
    case _ where number < 1 :
        return false
    case 1:
        return true
    default:
        break
    }
    let test = number.squareRoot()
    for i in 2..<number {
        if isDivisable(number, by: i) {
            return false
        }
    }
    return true
 }

let test = number.squareRoot() 行会产生编译错误

“Int”类型的值没有成员“squareRoot”

但是如果我将上面的行替换为:

test = 100.squareRoot()

那么就没有编译器错误了。 number100 的两个值都是 Int 类型。那么编译器不喜欢我在参数squareRoot 上使用number 的原因是什么

希望这是有道理的

干杯

【问题讨论】:

    标签: swift swift5


    【解决方案1】:

    squareRoot()FloatingPoint 协议中定义的方法,DoubleFloat 符合该方法,但不符合Int 之类的整数类型。

    因此,您必须将Int 转换为Double(并将结果转换回Int):

    let upperBound = Int(Double(number).squareRoot())
    for i in 2..<upperBound {
    

    另一个例子

    let test = 100.squareRoot()
    

    编译是因为IntDouble 都符合ExpressibleByIntegerLiteral 协议,即可以从整数文字初始化。这里编译器自动推断100 是一个浮点值,因为这是使代码编译的唯一方法。在这里很明显:

    let test = 123.squareRoot()
    print(test) // 11.090536506409418
    

    【讨论】:

    • 有道理,ctrl 点击 100 显示 Int,但 100 可以推断为键入 double 。非常感谢。我能问一下你是怎么知道的吗?是经验还是看 squareRoot() 的协议和方法?
    • @hoboBob 平方根没有在整数上定义,即使在数学中也是如此,因为结果不能用整数表示。在编程中也是类似的情况。有了足够的经验,您就知道会发生什么。在其他编程语言中,唯一的区别是整数可以自动转换为浮点数(无需显式转换)。
    • 哇简单。问一个愚蠢的问题并得到一个非常好的答案。谢谢。我得到 Martins 的观点,他的编辑太数字不是 int 文字,它被推断为 Int。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多