Swift 5调用squareRoot()

时间:2019-05-15 09:43:33

标签: 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
 }

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

  

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

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

test = 100.squareRoot()

然后没有编译器错误。值number和显然是100的类型均为Int。那么,编译器不喜欢我在参数squareRoot上使用number

吗?

希望这很有意义

欢呼

1 个答案:

答案 0 :(得分:4)

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