Swift 5 调用 squareRoot()

hob*_*Bob 2 swift swift5

我正在为初学者阅读 Swift 4。我正在制作素数检查器,并希望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
 }
Run Code Online (Sandbox Code Playgroud)

该行let test = number.squareRoot()生成编译器错误

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

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

test = 100.squareRoot()
Run Code Online (Sandbox Code Playgroud)

然后没有编译器错误。这两个值number和显然100都是 type Int。那么编译器不喜欢我squareRoot在参数上的使用是什么?number

希望这是有道理的

干杯

Mar*_*n R 7

squareRoot()是在FloatingPoint协议中定义的一种方法,它DoubleFloat符合,但不是像Int.

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

let upperBound = Int(Double(number).squareRoot())
for i in 2..<upperBound {
Run Code Online (Sandbox Code Playgroud)

另一个例子

let test = 100.squareRoot()
Run Code Online (Sandbox Code Playgroud)

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

let test = 123.squareRoot()
print(test) // 11.090536506409418
Run Code Online (Sandbox Code Playgroud)