Swift 5 调用 squareRoot()

Swift 5 calling squareRoot()

我正在阅读初学者的 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
 }

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

Value of type 'Int' has no member 'squareRoot'

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

test = 100.squareRoot()

那就没有编译器错误了。两个值 number 和显然 100 都是类型 Int。那么什么是编译器不喜欢我在参数 number

上使用 squareRoot

希望这是有道理的

干杯

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